pip 安装使用详解:http://www.ttlsa.com/python/how-to-install-and-use-pip-ttlsa
python 包:https://pypi.python.org/pypi
1、Linux 源码安装 Python3
- 下载源码包
https://www.python.org/downloads/ - 解压(以3.64版本为例)
wget https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz
tar -zxvf Python-3.6.4.tgz
cd Python-3.6.4 - 安装
./configure --prefix=/usr/local/python3
make && make install - 添加软链接
ln -s /usr/local/python3/bin/python3 /usr/bin/python3 - 安装第三方库
yum install python-pip
pip install --upgrade pip
python3 -m pip freeze
python3 -m pip install redis
python3 -m pip install pymongo
python3 -m pip install pymysql
python3 -m pip install configparser
豆瓣源:
pip Install:pip install -i https://pypi.douban.com/simple/
安装 pip3 ( centos )
install pip3 for python 3.x:https://www.cnblogs.com/wenchengxiaopenyou/p/5709218.html
2、安装 pip
Python 装包的几种方式
- 1. easy_install 是最古老的包安装方式,目前基本没有人使用。
- 2. pip 是最主流的包管理方案,类似于 macOS 上的 brew,Ubuntu 上的 apt,CentOS 上的 yum。使用 pip install xxx 就可以从 PYPI 上搜索并安装。
- 3. pipx 依赖 pip 和 venv,是一个专门用于安装和管理包的 CLI应用程序的工具,简化了使用 venv 或者 virtualenv 新建虚拟环境步骤,使用 pipx 安装的 Python 包会单独安装到一个全新的独有虚拟环境。
$ python3 -m pip install --user pipx
$ python3 -m userpath append ~/.local/bin
# 创建虚拟环境并安装包
$ pipx install pkg - 4. 如果源码中有 setup.py 文件,命令直接安装:python setup.py install
- 5. 使用 yum。Python 包在使用 setup.py 构建的时候,对于包的发布格式有多种选项,其中有一个选项是 bdist_rpm,以这个选项发布出来的包是 rpm 的包格式。 python setup.py bdist_rpm 。对于rpm 这种格式,你需要使用 yum 或者 rpm 来安装。
使用 yum 安装:yum install pkg
使用 rpm 安装:rpm -ivh pkg
使用 get-pip.py 安装 (推荐)
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py
pip -V // 查看 pip 版本以及 Python 版本
// pip 20.1.1 from /usr/local/lib/python2.7/dist-packages/pip (python 2.7)
如果安装的是 python3, 则 python3 默认安装的有 pip3 ,不需要再自己安装 pip3。
pip3 安装在 python3 路径下的 bin 目录里面如果没有,则 执行 python3 get-pip.py
pip3 -V // 查看 pip 版本以及 Python 版本
// pip 20.1.1 from /usr/local/lib/python3.8/dist-packages/pip (python 3.8)
查看 离线帮助
执行命令:python -m pydoc -p 5200
命令行 执行 Python 代码
示例:python -c "import hashlib;print(hashlib.md5('hello').hexdigest())"
在执行任意代码前自动念一段平安经
如果对 Linux 比较熟悉,就会知道,当你在使用 SSH 远程登陆 Linux 服务器的时候?会读取 .bash_profile 文件加载一些环境变量。.bash_profile 可以视其为一个 shell 脚本,可以在这里写一些 shell 代码达到你的定制化需求。
而在 Python 中,也有类似 .bash_profile 的文件,这个文件一般情况下是不存在的。我们需要新建一个用户环境目录,这个目录比较长,不需要你死记硬背,使用 site 模块的方法就可以获取,然后使用 mkdir -p 命令创建它。
在这个目录下,新建一个 usercustomize.py 文件,注意名字必须是这个,换成其他的可就识别不到啦。usercustomize.py 的内容如
msg = r"""
_ooOoo_
o8888888o __________________________________
88" . "88 | 爬虫工程师平安 后端工程师平安 |
(| -_- |) | 数据分析师平安 自动化运维平安 |
O\ = /O <__________________________________|
____/`---'\____
. ' \\| |// `.
/ \\||| : |||// \
/ _||||| -:- |||||- \
| | \\\ - /// | |
| \_| ''\---/'' | |
\ .-\__ `-` ___/-. /
___`. .' /--.--\ `. . __
."" '< `.___\_<|>_/___.' >'"".
| | : `- \`.;`\ _ /`;.`/ - ` : | |
\ \ `-. \_ __\ /__ _/ .-` / /
======`-.____`-.___\_____/___.-`____.-'======
`=---='
.............................................
佛祖保佑 永无BUG
"""
print(msg)
3、使用 pip
pip 帮助
用法:
pip <命令> [选项]
命令:
install 安装包。
lock 生成锁文件。
download 下载包。
uninstall 卸载包。
freeze 以 requirements 格式输出已安装的包。
inspect 检查 python 环境。
list 列出已安装的包。
show 显示已安装包的信息。
check 验证已安装的包是否具有兼容的依赖关系。
config 管理本地和全局配置。
search 在 PyPI 上搜索包。
cache 检查和管理 pip 的 wheel 缓存。
index 检查包索引中可用的信息。
wheel 根据您的需求构建 wheels。
hash 计算包存档的哈希值。
completion 用于命令补全的辅助命令。
debug 显示有助于调试的信息。
help 显示命令帮助。
通用选项:
-h, --help 显示帮助。
--debug 让未处理的异常传播到主子程序外部,而不是记录到 stderr。
--isolated 以隔离模式运行 pip,忽略环境变量和用户配置。
--require-virtualenv 只允许 pip 在虚拟环境中运行;否则退出并显示错误。
--python <python> 使用指定的 Python 解释器运行 pip。
-v, --verbose 增加输出。该选项可累加,最多可使用 3 次。
-V, --version 显示版本并退出。
-q, --quiet 减少输出。该选项可累加,最多可使用 3 次(对应 WARNING、ERROR 和 CRITICAL 日志级别)。
--log <路径> 详细追加日志的路径。
--no-input 禁用输入提示。
--keyring-provider <keyring_provider>
如果允许用户输入,则启用通过 keyring 库查找凭据。指定要使用的机制 [auto, disabled, import, subprocess]。(默认:auto)
--proxy <代理> 以 scheme://[user:passwd@]proxy.server:port 格式指定代理。
--retries <重试次数> 建立新 HTTP 连接的最大尝试次数。(默认:5)
--timeout <秒> 设置套接字超时(默认 15 秒)。
--exists-action <操作> 路径已存在时的默认操作:(s)witch 切换、(i)gnore 忽略、(w)ipe 清除、(b)ackup 备份、(a)bort 中止。
--trusted-host <主机名> 将此主机或主机:端口对标记为受信任,即使它没有有效的或任何 HTTPS。
--cert <路径> PEM 编码的 CA 证书包路径。如果提供,将覆盖默认值。更多信息请参见 pip 文档中的"SSL 证书验证"。
--client-cert <路径> SSL 客户端证书路径,包含私钥和证书的单个 PEM 格式文件。
--cache-dir <目录> 将缓存数据存储在 <目录> 中。
--no-cache-dir 禁用缓存。
--disable-pip-version-check
不定期检查 PyPI 以确定是否有新版本的 pip 可供下载。使用 --no-index 时隐含此选项。
--no-color 抑制彩色输出。
--use-feature <功能> 启用可能向后不兼容的新功能。
--use-deprecated <功能> 启用将在未来被移除的已弃用功能。
--resume-retries <恢复重试次数>
恢复或重新开始不完整下载的最大尝试次数。(默认:0)
如果想看 pip 中某个 命令的帮助,例如 pip list ,可以使用: pip list -h
root@kali:~$ pip list -h
Usage:
pip list [options]
Description:
List installed packages, including editables.
Packages are listed in a case-insensitive sorted order.
List Options:
-o, --outdated List outdated packages
-u, --uptodate List uptodate packages
-e, --editable List editable projects.
-l, --local If in a virtualenv that has global access, do not list globally-installed packages.
--user Only output packages installed in user-site.
--pre Include pre-release and development versions. By default, pip only finds stable versions.
--format <list_format> Select the output format among: legacy (default), columns, freeze or json.
--not-required List packages that are not dependencies of installed packages.
Package Index Options (including deprecated options):
-i, --index-url <url> Base URL of Python Package Index (default https://pypi.python.org/simple). This should
point to a repository compliant with PEP 503 (the simple repository API) or a local
directory laid out in the same format.
--extra-index-url <url> Extra URLs of package indexes to use in addition to --index-url. Should follow the same
rules as --index-url.
--no-index Ignore package index (only looking at --find-links URLs instead).
-f, --find-links <url> If a url or path to an html file, then parse for links to archives. If a local path or
file:// url that's a directory, then look for archives in the directory listing.
--process-dependency-links Enable the processing of dependency links.
示例: pip list --outdata 查看需要更新的 python 包
pip cache purge 清除所有缓存
pip cache remove package-name 清除指定软件包的缓存
pypi 清华源:https://mirrors.tuna.tsinghua.edu.cn/help/pypi/
pip --no-cache-dir -i 国内源 install 包名
安装 到 用户环境
当在机器上并没有 root 权限时,可以使用 pip install --user pkg 将包安装在你的用户环境中,该用户环境与全局环境并不冲突,并且多用户之间相互隔离,互不影响。
# 在全局环境中未安装 requests
[root@localhost ~]$ pip list | grep requests
[root@localhost ~]$ su - wangbm# 由于用户环境继承自全局环境,这里也未安装
[wangbm@localhost ~]$ pip list | grep requests
[wangbm@localhost ~]$ pip install --user requests
[wangbm@localhost ~]$ pip list | grep requests
requests (2.22.0)
[wangbm@localhost ~]$# 从 Location 属性可发现 requests 只安装在当前用户环境中
[wangbm@localhost ~]$ pip show requests
---
Metadata-Version: 2.1
Name: requests
Version: 2.22.0
Summary: Python HTTP for Humans.
Home-page: http://python-requests.org
Author: Kenneth Reitz
Author-email: me@kennethreitz.org
Installer: pip
License: Apache 2.0
Location: /home/wangbm/.local/lib/python2.7/site-packages
[wangbm@localhost ~]$ exit
logout# 退出 wangbm 用户,在 root 用户环境中发现 requests 未安装
[root@localhost ~]$ pip list | grep requests
[root@localhost ~]$
pip 常用 命令
安装包:pip install xxx
通过豆瓣源安装包:pip install -i https://pypi.douban.com/simple xxx
卸载包:pip uninstall xxx
查看包的信息:pip show xxx
检查需要更新的包:pip list --outdated
升级包:pip install --upgrade xxx
冻结当前环境,生成安装的包的列表文件:pip freeze > requirements.txt
通过包的列表文件安装:pip install -r requirements.txt
查看一个包的依赖包
# 查看单个包的详细信息,包括依赖
pip show package_name
# 示例
pip show requests
# 查看包的详细信息(包括依赖)
pip show --verbose package_name
使用 pipdeptree 工具,首先安装 pipdeptree:pip install pipdeptree
# 查看所有包的依赖树
pipdeptree
# 查看特定包的依赖
pipdeptree -p package_name
# 以图表形式显示依赖关系
pipdeptree --graph-output svg > dependencies.svg
使用 requirements-tools
# 安装工具
pip install pip-tools
# 生成依赖文件
pip-compile requirements.in
推荐方法
- 快速查看: 使用 pip show package_name
- 详细依赖树: 使用 pipdeptree
- 可视化: 使用 pipdeptree --graph-output
这些方法可以帮助你全面了解 Python 包的依赖关系,便于包管理和解决依赖冲突问题。
使用 豆瓣源、清华源
清华,仅支持 HTTPS:https://pypi.tuna.tsinghua.edu.cn/simple/
清华大学开源软件镜像站:https://mirrors.tuna.tsinghua.edu.cn/help/pypi/
阿里,HTTP 和 HTTPS 均支持
:http://mirrors.aliyun.com/pypi/simple/
:https://mirrors.aliyun.com/pypi/simple/豆瓣,HTTP 和 HTTPS 均支持
:http://pypi.doubanio.com/simple/
:https://pypi.doubanio.com/simple/
pip 临时使用
示例:python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip
示例:pip install robobrowser -i http://pypi.doubanio.com/simple/
设为默认(永久修改 )
示例:pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
Linux下修改 ~/.pip/pip.conf (没有就创建,文件夹要加 “.”,表示是隐藏文件夹)。内容如下:
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host=mirrors.aliyun.com
windows 下是 C:\Users\用户名\pip\pip.ini 内容同上。
如果想配置多个镜像源平衡负载,可在已经替换 index-url 的情况下通过以下方式继续增加源站:
pip config set global.extra-index-url "<url1> <url2>..."
请自行替换引号内的内容,源地址之间需要有空格。
可用的 pypi 源列表(校园网联合镜像站):https://mirrors.cernet.edu.cn/list/pypi
正确且优雅的装包
使用 pip 来安装第三方的模块时,通常会使用这样的命令:pip install xxx 。此时如果你的环境中有 Python2 也有 Python 3,那你使用这条命令安装的包是安装 Python2 呢?还是安装到 Python 3 呢?就算你的环境上没有安装 Python2,那也有可能存在着多个版本的 Python 吧?比如安装了 Python3.8,也安装了 Python3.9,那你安装包时就会很困惑,我到底把包安装在了哪里?使用下面命令去安装,就可以安装到对应的环境中。
在python2中安装: python -m pip install requests
在python3.8中安装:python3.8 -m pip install requests
在python3.9中安装:python3.9 -m pip install requests
通常情况下,如果同时安装了python2.x和python3.x 就会有两个pip。一个pip2一个pip3。如果 pip 版本过低,需要升级时,正确升级对应 python 解释器的 pip ( 如果有多个 Python 环境,则需要加上 python解释器的版本号):python3.9 -m pip install --upgrade pip
注意 ( 大坑 ):sudo 和 非sudo 执行 pip install 有时候安装目录不一样
python3.9 -m pip install --upgrade pip
sudo python3.9 -m pip install --upgrade pip
强制升级所有包
pip list --outdated --format=freeze | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip install -U
pip list --outdated --format=freeze
:列出所有已安装但版本不是最新的包。grep -v '^\-e'
:排除可编辑安装的包,这些通常是通过本地路径或VCS链接安装的包。cut -d = -f 1
:使用=
作为分隔符,仅获取包名。xargs -n1 pip install -U
:将每个包名单独传递给pip install -U
命令,进行升级。
4、site-packages 和 dist-packages
有些包是安装在 site-packages 下,而有些包安装在 dist-packages 下。dist-packages 其实是 debian 系的 Linux 系统(如 Ubuntu)才特有的目录,当使用 apt 去安装的 Python 包会使用 dist-packages,而使用 pip 或者 easy_install 安装的包还是照常安装在 site-packages 下。Debian 这么设计的原因,是为了减少不同来源的 Python 之间产生的冲突。
查看 site-package 所在目录
在 Python 交互式 Shell 中,输入以下代码以获取 site-packages 路径:
import site
print(site.getsitepackages())
from distutils.sysconfig import get_python_lib
print(get_python_lib())
查看 Python 解释器的绝对路径
import sys
print(sys.executable)
查看当前 lib 路径
>>> import sys
>>> print(sys.path)>>> import sys
>>> from pprint import pprint
>>> pprint(sys.path)
执行命令:python -c "print('\n'.join(__import__('sys').path))"
执行命令:python -m site
查看 Python 环境信息:python -m sysconfig
5、pipx
虽然 python 自带的 pip 工具提供了丰富的安装与管理功能,同时在 virtualenv 的帮助下并不是太担心 Python 的版本升级会对开发环境产生太大的影响。但是,我们通过 pip 安装的 Python 实用工具,在版本升级的过程中并不能幸免。除非我们单独设置独立的,专门用于安装这些工具的虚拟环境。但是,每次安装都需要切换到虚拟环境,未免显得过于繁琐。难道就不能更给力一些嘛~~答案当然是肯定的。pipx
就是为了解决这样的困扰而诞生的。
pipx 可以在隔离环境中安装和运行Python应用程序。它的主要优势在于可以将每个工具安装在一个隔离的虚拟环境中,同时又可以全局调用这些工具,既解决了版本冲突的问题,又保持了系统的整洁。
核心概念
- 虚拟环境:pipx 会为每个安装的工具创建一个独立的虚拟环境。
- 全局可用:尽管工具被安装在独立的虚拟环境中,但 pipx 会创建一个全局可访问的命令链接,使得你可以像平常一样使用这些工具。
pipx 的工作原理可以简化为以下几个步骤:
- 创建一个新的虚拟环境。
- 在这个虚拟环境中安装指定的命令行工具。
- 将工具的可执行文件链接到全局环境,使其可全局调用。
这样做的好处是,每个工具都在其独立的环境中运行,不会干扰其他工具和项目的依赖。
安装:https://github.com/pypa/pipx
一个绝佳的包管理器 pipx:https://blog.youkuaiyun.com/pythondh1/article/details/139227698
6、Python 包管理工具 PDM
PDM 是一个现代 Python 包和依赖项管理器,支持最新的 PEP 标准。但它不仅仅是一个包管理器。它在各个方面提升了您的开发工作流程。最显着的好处是它以类似的方式安装和管理软件包,根本不需要创建虚拟环境,灵活而强大的插件系统。PDM 需要 python 3.8 或更高版本。
pypi :https://pypi.org/project/pdm/
安装:pip install pdm
更新 PDM 版本:pdm self update
官网文档
- Introduction 介绍
- New Project 新建项目
- Manage Dependencies 管理依赖
- Build and Publish 构建、发布
- Configure the Project 配置项目
- PDM Scripts pdm 脚本
- Lifecycle and Hooks 生命周期和hook
- Advanced Usage 高级用法
- Working with Virtual Environments 使用虚拟环境
- Working with PEP 582
- Create Project From a Template 从模板创建项目
初始化 PDM
执行 pdm init 就会开始初始化,初始化的时候,会让你选择项目的一些信息
- 是否要上传 PyPI
- 依赖的 Python 版本
- License 类型
- 作者信息
- 邮箱信息
完成之后,PDM 会将你的选择以 toml 格式写入 pyproject.toml 配置文件中。
其他方案迁移到 pdm
pdm 足够好用,也足够开放,如果你当前使用的是其他的包管理器,比如 pipenv ,poetry,或者还在用最原始的 requirements.txt ,你也可以很方便的迁移到 pdm 中来:
- 使用 pdm import -f {file} 无需初始化,直接转换
- 执行 pdm init 或者 pdm install 的时候,会自动识别你当前的依赖情况并转换
pdm 迁移到其他方案
pyproject.toml 和 pdm.lock是 pdm 的两个核心文件。
- 将 pyproject.toml 转成 setup.py:pdm export -f setuppy -o setup.py
- 将 pdm.lock 转成 requirements.txt:pdm export -o requirements.txt
PDM 用法
pdm 有非常多的命令,使用 -h
可以看到帮助菜单
安装包:pdm add requests
查看包的详情:pdm show
查看包:pdm list --graph
pdm list 还有两个选项:
- --freeze:以 requirements.txt 的格式列出已安装的包
- --json:以 json 的格式列出已安装的包,但必须与 --graph 同时使用
删除包:pdb remove requests
项目配置:pdm config
想要修改的话,只要加 key 和 value 做为参数即可,以修改 pypi 镜像代理为例
现在改成 阿里源,只需要执行如下命令
pdm config 配置 查阅:https://pdm.fming.dev/configuration/
运行命令
在 pdm 的环境中执行命令或者项目,可以使用 run 命令,若是执行项目时,有诸多参数,可以在 pyproject.toml 配置命令别名。
查看环境
使用 info
命令,可以查看当前项目的环境信息
更新包
更新所有包:pdm update
更新某个包:pdm update <pkg>
--save-compatible:项目依赖可兼容的版本
--save-wildcard:保存通配符版本(暂不明白)
--save-exact:保存有指定确切版本的包
--save-minimum:保持最小版本的包
--update-reuse:尽量只更新命令行中指定的包,其依赖包能不更新则不更新
--update-eager:更新某个包顺带更新其依赖包(递归升级)
--prerelease:允许提前释放
--unconstrained:忽略包版本的约束,可将包升级至最新版本
--top:仅更新有在 pyproject.toml 的包
--dry-run:试运行,而不去修改 lock 文件
--no-sync:只更新 lock 文件,但不更新包
如果依赖包有设置分组,还可以指定分组进行更新:pdm update -G security -G http
也可以指定分组更新分组里的某个包:pdm update -G security cryptography
更新所有的 dev 依赖:pdm update -d # -d 指定 dev 依赖
更新 dev 依赖下某个分组的某个包:pdm update -dG test pytest
同样地,也可以指定 --prod 或者 --production 升级非 dev (即生产)的包。
切换 py
在初始化 pdm 项目时,就已经选定了当前的 Python 版本和可用的 Python 版本范围,后面如果想更改,可以使用 use 命令,但版本要受之前设定的版本范围约束。
假设允许范围是 python 3.9+,当前使用的是 python 3.10,可以直接切换过去。
命令:pdm use python3.9
命令别名
在 pyproject.toml 添加 [tool.pdm.scripts]
可以设置快捷命令别名,若项目的执行有非常多的参数,这种设定别名的方法将很有用。
[tool.pdm.scripts]
有两种形式
# 第一种
[tool.pdm.scripts]
start = "python main.py"# 第一种
[tool.pdm.scripts]
start = {cmd = "python main.py"}
但若想在参数中加注释,就必须得使用第二种方法,例如这样
[tool.pdm.scripts]
start = {cmd = [
"flask",
"run",
# Important comment here about always using port 54321
"-p", "54321"
]}
除了 cmd 之外,还有两个参数。
一个是 shell 参数,从输出来看你应该和看出和 cmd 的区别,和 subprocess.Popen()
with shell=True
差不多一个意思
个是 env_file 参数,可以指定配置环境变量的文件
[tool.pdm.scripts]
start.cmd = "flask run -p 54321"
start.env_file = ".env"
如果想要把这个环境变量的文件不仅限于某个命令,而是 pdm run 全局,可以这样配置
[tool.pdm.scripts]
_.env_file = ".env"
加 --list
或者 -l
可以查看所有设置的快捷别名
对于每一个快捷命令,都可以设置 pre 和 post 命令:
- pre 命令:在每次快捷命令执行前会执行
- post 命令:在每次快捷命令执行后会执行
[tool.pdm.scripts]
pre_compress = "{{ Run BEFORE the `compress` script }}"
compress = "tar czvf compressed.tar.gz data/"
post_compress = "{{ Run AFTER the `compress` script }}"