Python之pip包管理
1. 安装pip3
pip3是pyhton3.0的包管理命令,而pip是python2.0的管理命令,pip3是python包的安装、管理命令,共有两种安装方式
1.1 系统安装
系统安装相对简单一些,直接打开终端键入以下命令即可(松松使用的是ubuntu 18.04):
$ sudo apt update #更新软件列表
$ sudo apt install python-pip3 #安装pip3
$ sudo pip3 -h # 检查是否安装成功
1.2 使用Python安装
使用python3进行安装有些麻烦,首先要获取get-pip.py文件,使用该方式安装则比较灵活
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py #获取get-pip.py文件
$ python get-pip.py # #安装pip
$ sudo pip3 -h # 检查是否安装成功
注:
- 这里需要curl与python两个命令,如需要可以安装
- get-pip.py 可以网上下载然后直接运行,从而无需使用curl命令
$ python get-pip.py -no-setuptools --no-wheel # 不尝试安装wheel和setuptools
$ python get-pip.py --no-index --find-links=/local/copies # 使用本地的pip和setuptools进行安装
$ python get-pip.py --proxy="http://[user:passwd@]proxy.server:port" # 安装到代理服务器上
$ python get-pip.py pip==9.0.2 wheel==0.30.0 setuptools==28.8.0 选择特定pip版本,wheel版本及setuptools版本进行安装
2. 使用手册
2.1 运行pip
pip是命令行命令,即可以再终端中直接使用,如果在终端中无法使用,可能存在以下几种可能:
2.1.1 未安装pip
直接安装pip,详情请参考《1. 安装pip3》
2.1.2 未设置环境变量
当未设置环境变量时,如果不在pip安装的路径下,则会提示如下内容
Command 'pip' not found, but can be installed with:
sudo apt install python-pip
看到以下提示时,可以进行查看 pip3有没有安装以及安装位置
$ whereis pip3
如果pip3安装了,则会返回地址,否则是没有安装。拿到pip3的地址后,则需要设置环境变量,设置环境变量有3中选择,如下所示:
# 1. 临时添加该环境变量,命令行直接运行
$ exprot PATH = "pip3 location :$PATH"
# 2. 永久修改当前用户的环境变量,无需sudo权限
$ gedit ~/.bashrc
exprot PATH = "pip3 location :$PATH" # 将该代码粘贴到.bashrc文件,保存即可
$ source ~/.bashrc
# 3. 永久修改用户的环境变量,需sudo权限
$ sudo gedit /etc/profile
exprot PATH = "pip3 location :$PATH" # 将该代码粘贴到/etc/profile文件,保存即可
$ sudo source /etc/profile
2.1.3 使用python进行
pip 也可以使用python命令进行执行,命令如下:
$ python -m pip <pip arguments>
2.2 安装py包
pip支持直接从pypi安装包、版本控制、本地安装或者直接从分发包中安装,但最常用的是从pypi安装,代码如下
$ pip install SomePackage # 最新版本
$ pip install SomePackage==1.0.4 # specific version
$ pip install 'SomePackage>=1.0.4' # minimum version
2.3 使用代理服务器
当使用代理服务器时,需要按照以下方式安装,
$ pip --proxy==[user:passwd@]proxy.server:port
2.4 requirements 文件
2.4.1 requrements使用
该文件包含需要使用pip3 install安装的一系列包,一般来说,该文件是将pip3 install 安装的所需的参数放置在一个文件内。该文件大致有4种用途:
2.4.1.1 可重复安装
当需要对固定包的版本进行重复安装过时,个人理解,当需要对另一台pc进行环境配置时用到,将当前配置好的PC环境移植到另一台pc上用到
$ pip3 freeze > requirements.txt
$ pip3 install -r requirements.txt
2.4.1.2 解决包之间版本冲突的问题
假如有三个包A、B、C,A需要 C>=1.0,而B需要1.0<=C<=3.0,如果直接使用pip命令安装时,如若先安装A包,则有可能安装的包不能满足B包的需要,因此,为了解决该问题而来,解决方案如下,直接再requrements文件中输入以下代码即可
pkg1
pkg2
pkg3>=1.0,<=2.0
2.4.1.3 强制安装低版本的包
假如有两个包A、C,A依赖C<= 1.3版本,直接在requrements文件中输入以下代码即可
ProjectA
ProjectB<1.3
2.5 constraints文件
该文件的用途主要是限制文件中的包被重新安装。假设你有包A,该当前环境需要特定某个包A的特定版本,包B也需要包A,为了保持环境的延续性,则将包A写入constraints文件,防止其被升级。
2.6 wheel
相对于源代码的编译和安装,wheel 提供了更加方便快捷的方式。
pip首选使用wheel进行安装,如果不需要,则使用 --no-binary
来限制pip的安装。
$ pip install SomePackage-1.0-py2.py3-none-any.whl #使用wheel进行安装
如果没有合适的wheel,pip install会选择合适的源代码进行安装,即可以使用命令pip wheel
来进行源码安装,在使用pip wheel
前,需要对安装wheel
(该包提供了bdist_wheel的setuptools的扩展),
$ pip install wheel
$ pip wheel --wheel-dir=/local/wheels -r requirements.txt # 构建wheel并将包名写入requirements文件中
$ pip install --no-index --find-links=/local/wheels -r requirements.txt #指定安装wheel位置和包名
2.7 用户安装
允许在没有全局写入权限的人单独安装自己的包,可以通过设置环境变量PYTHONUSERBASE
来更改安装位置,环境变量会更新到site.USER_BASE
,再python中,用户安装的包的位置由site.USER_BASE
变量确认。如以下代码
$ export PYTHONUSERBASE=/myappenv
$ pip install --user
安装相关规则:
- 当安装的包与全局的包有冲突时,忽视不会卸载全局包
- 当安装的包与全局包一样时,告知全局包如何满足当前依赖并且不进行安装
- 当有
--no-site-packages
虚拟环境时,pip不会进行用户安装,因为再虚拟环境下,用户的site-packages是不可见的 - 当在一个
--system-site-packages
虚拟环境时,不会安装一个与虚拟环境site-packages相冲突的 包,因为缺少sys.path的优先权
2.8 固定版本
使用固定版本可以防止安装bug及与当前包集不适配的版本。在使用pip freeze产生的requirements文件不仅可以保证顶层的依赖关系而且也可以保证子依赖的兼容性。
可以添加hash校验,保证包的正确性。
2.9 程序中使用pip
pip可以再python代码中使用,通过import pip
d的形式,但不要使用pip的内部api,原因如下:
- pip的代码不是线程安全的,因此使用代码开辟一个线程后,不保证一定能开辟成功
- pip假定执行完工作后,将会关闭线程。
- pip假定位命令行使用,没有考虑过代码使用,可能会受到影响。
最好在子进程中实验更改功能,代码如下
# 需要导入 subprocess 模块
subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'my_package'])
2.10 config 文件
config文件是存储所有命令及其参数配置的地方,可以更改所有命令的默认形式。
其存放位置如下:
- site-wide全部用户:/etc/pip.conf 或者使用环境变量
- 当前用户:~/.config/pip/pip.conf 或者~/.pip/pip.conf
- 虚拟环境:存放在 $虚拟环境/pip.conf
- 如果以上几个文件均存在,则其调用顺序为:site-wide > per-user > virtualenv
在使用命令的过程中,有如下几条原则:
- 新的参数替换旧内容,子参数命令配置覆盖
global
命令 - 每条命令均可以根据自己参数进行配置默认的参数
- 支持同一个命令多个标签,同一个参数多个内容
config可以使用环境变量来设置,方法如下:
- 可以使用环境变量来替代参数,但必须以PIP_开头,并使用_作为分隔符
- 优先级:参数使用>环境变量>conf 子命令>conf global
- 自动补全命令,支持bash zsh fish pip completion --bash >> ~/.profile
在安装包的过程中,如果要制定以用户的权限进行安装,则需要使用 --user参数,且包更新策略:更新所有依赖,不管是否满足新的依赖;仅仅更新需要的依赖,默认 only-if-needed;upgrade-all 是安全的eager更新
3. 参考手册
该部分主要介绍,pip命令的各种命令及其参数的使用
3.1 pip
3.1 使用方式
pip <command> [options]
3.2 描述
3.2.1 日志
3.2.1.1 控制台日志
pip 通过几个参数控制控制台的日志输出等级,参数如下:
-v, --verbose
:输出详细日志-q, --quiet
:静默输出,不输出任何内容--no-color
:错误与警告不以颜色字体突出
3.2.1.2 文件日志
pip提供参数来将日志存入到文件中
--log <path>
:存储日志到文件中
3.2.1.3 --exists-action
如果路径存在,则执行如下载文件、检查安装库、创建安装档案,如果该选项没有被定义,pip将会提示。
- switch:仅仅进行相关的VCS检查。
- ignore:中断当前操作
- wipe:再创建、下载或检查一个新包时,删除一个文件或VCS 检查
- backup:当.bak文件存在时,重命名该文件或检查该文件名字
- abort:终端pip同时返回非零退出状态
3.2.2 创建系统接口
pip 通过构建系统来创建包。默认情况下,使用setuptools
来进行型,如果工程通过pyprojec.toml
文件指定了一个不同的构建系统,pip将会使用这个系统。构建系统使用源码生成“轮子”,然后再使用“轮子”安装包。
构建系统的当前接口通过setup.py
脚本来定义全部的构建行为。
3.2.2.1 setputools的注入
当PEP 517
没有被使用十,setuptools
是支持的构建系统,然而并不是所有的包都使用该系统,再调用setup.py
之前,pip通过`将setuptools
注入```sys.modules``来实现。
修改构建系统的输出编码:local.getpreferredencoding
3.3 一般选项
-h, --help
:显示帮助信息--isolated
:pip运行在隔离状态,忽视环境变量和用户配置-v, --version
:显示版本信息--proxy<proxy>
:以[user:passwd@]proxy.server:port.指定代理位置--retries <retries>
:每次链接可以被重复的最大次数--timeout <sec>
:设置超时时间--trusted-host <hostname>
:标记合法主机和端口,及时不存在合法或者https--cert <path>
:备用CA捆绑软件的路径。--client-cert <path>
:ssl认证路径,文件中包PEM格式的私钥及认证--cache-dir <dir>
:存储缓存数据的路径--no-cache-dir
:不缓存--disable-pip-version-check
:不要定期检查PyPI,以确定是否有新版本的pip可用于下载--no-python-version-warning
:即将推出的不受支持的Python的静默弃用警告。
3.2 pip install
3.2.1 使用方式
pip install [options] <requirement specifier> [package-index-options] ...
pip install [options] -r <requirements file> [package-index-options] ...
pip install [options] [-e] <vcs project url> ...
pip install [options] [-e] <local project path> ...
pip install [options] <archive url/path> ...
3.2.2 描述
包来自于
- 使用
requirements
指定的pypi - VCS 项目 urls
- 本地包
- 本地或远程获得的源码
3.2.3 概览
pip安装的步骤
- 确认基本需要,参数在此处进行处理
- 解决依赖,决定需要安装哪些包
- 创建轮子,所有的依赖关系在此处构建出轮子
- 安装包
3.2.4 参数处理
pip 处理包来源的顺序
- url或者项目
- 本地文件夹(需要包含
setup.py
) - 本地文件
- requirements
3.2.5 计算项目名和版本
对于wheel,其清楚知道需要的项目名和版本号。对于本地文件夹,需要setup.py egg_info
文件来决定项目的元数据。
当全部版本都满足时,安装最新的版本。如果多个源码合适,则假定任何一份源码都是可接受的。
3.2.6 安装顺序
在进行包的依赖时,遵循顶层顺序的原则,则优先装顶级依赖,如果在依赖中出现了环,则遵循顶层依赖最后安装的策略。
3.2.7 requirements文件格式
[[--option]...]
<requirement specifier> [; markers] [[--option]...]
<archive url/path>
[-e] <local project path>
[-e] <vcs project url>
- 文件的每一行都相当于一个 pip install。
# -*- coding: utf-8 -*-
指定文件格式- 可以使用环境变量来
3.3 pip download
3.3.1 使用方式
pip download [options] <requirement specifier> [package-index-options] ...
pip download [options] -r <requirements file> [package-index-options] ...
pip download [options] <vcs project url> ...
pip download [options] <local project path> ...
pip download [options] <archive url/path> ...
3.3.2 描述
包来自于(下载)
- 使用
requirements
指定的pypi - VCS 项目 urls
- 本地包
- 本地或远程获得的源码
3.3.3 参数
--no-clean
:不清理build文件夹-w,--wheel-dir<dir>
:将wheels生成在dir中,默认当前文件夹--no-binary <format_control>
:不使用二进制包。--only-binary
:不适合用源包--prefer-binary
:优先旧包--build-option
:支持setup.py bdist_wheel
的额外参数--no-build-option
:当生成发布资源时,不使用独立包--use-pep517
:使用PEP517来进行构建包-c,--constraint <file>
:限制文件-e,--editable <path/URL>
:在editable模式下安装项目-r,--requirements <file>
:安装requirements中的包--src <dir>
:检查editable项目的文件夹--ignore-requires-python
:忽略Require-python信息--no-deps
:不安装依赖包-b,--build<dir>
:创建包的文件夹--progress-bar <progess_bar>
:以指定类型显示信息--global-option
:再调用bdist_wheel
命令前额外的全局项--require-hashes
:进行hash校验-i,--index-url<url>
:根据 url装包--extra-index-url
:-i补充--no-index
:忽略包索引-f,--find-links<url>
:如果是url或者路径,则会在指定的url或路径下寻找.tar.gz或.whl文件进行安装。如果是本地文件夹,则会在本地list中寻找
3.4 pip uninstall
3.4.1 使用方式
pip uninstall [options] <package> ...
pip uninstall [options] -r <requrements files> ...
3.4.2 描述
卸载包,该命令可以卸载大多数的安装包,除了
- 通过 setup.py安装的pure distutuils包,因为没有安装依赖
- 通过 setup.py涉及的脚本
3.4.3 参数
-r,--requrements<file>
:卸载文件中指定的包-y,--yes
:不提示确认
3.5 pip freeze
3.5.1 使用方式
pip freeze [options]
3.5.2 描述
显示一个或多个已安装包的信息,其输出为RFC-邮件头格式。
3.5.3 参数
-r,--requrements<file>
:根据文件中的包的显示相应输出-f,--find-links<url>
:根据url查找包,并显示相关输出-l,--local
:如果虚拟环境中有全局连接权限,则不显示全局包--user
:仅仅显示user下的安装的包--path<path>
:根据提供的路径显示安装的包--all
:全部均进行显示,包含wheel、distribute、pip及setuptools--exclude-editable
:不显示可编辑的包
3.6 pip list
3.6.1 使用方式
pip list [options]
3.6.2 描述
显示全部包,包含editables的包。包名以字符的排序显示
3.6.3 参数
-o,--outdated
:显示过期的包-u,--untodate
:显示可以更新的包-e,--editable
:显示可编辑的包-l,--local
:如果虚拟环境中有全局连接权限,则不显示全局包包--path<path>
:根据提供的路径显示安装的包--user
:仅仅显示user下的安装的包s--pre
:包含预发布和开发模式下的版本,默认仅显示稳定包--format <list_format>
:设置输出格式:columns(默认)、freeze、json--not-required
:显示不依赖当前安装包的包--exclude-editable
:不显示可编辑的包--include-editable
包含可编辑的包-i,--index-url<url>
:根据 url装包--extra-index-url<url>
:-i的补充--no-index
:忽视包索引-f,--find-links<url>
:根据url查找包,并显示相关输出
3.7 pip show
3.7.1 使用方式
pip show [options] <package>
3.7.2 描述
以requirements格式输出已安装包的信息。并以字母顺序排列显示
3.7.3 参数
-f,--files
:显示每一个安装包的全部已安装文件列表
3.8 pip search
3.8.1 使用方式
pip search [options] <package>
3.8.2 描述
在pypi中查找包
3.8.3 参数
-i,--index<url>
:根据url查找包
3.9 pip cache
3.9.1 使用方式
pip cache dir
pip cache info
pip cache list [<pattern>]
pip cache remove <pattern>
pip cache purge
3.9.2 描述
检查并管理wheel的cache
dir
:显示cache文件夹info
:显示cache信息lsit
:显示cache中缓存的包remove
:移除cache中的包purge
:清空cache
3.9.3 参数
与pip保持一致
3.10 pip check
3.10.1 使用方式
pip check [options]
3.10.2 描述
验证已安装的包有合适的依赖
3.11 pip config
3.11.1 使用方式
pip config [<file-option>] list
pip config [<file-option>] [--editor <editor-path>] edit
pip config [<file-option>] get name
pip config [<file-option>] set name value
pip config [<file-option>] unset name
3.11.2 描述
管理本地与全局配置
list
:显示配置edit
:编辑配置get
:获取某项配置set
:设置某项unset
:取消某项
若没有任何设置的情况下,默认修改的是当前用户的。
3.11.3 参数
--editor<editor>
:编辑文件--global
:全局--user
:用户--site
:当前环境
3.12 pip wheel
3.12.1 使用方式
pip wheel [options] <requrements specifier>...
pip wheel [options] -r <requrements file>...
pip wheel [options] [-e] <vcs project url>
pip wheel [options] [-e] <local project path>
pip wheel [options] <archive url/path>
3.12.2 描述
根据requirement和依赖生成wheel。wheel是一种创建包的格式,具有在安装期间,不需要编译的优点。
为了确保pip能够创建wheel,setup.py
必须实现bdist_wheel
命令。该命令必须创建一个适合python解析器 调用的wheel,并将其输出到指定文件夹。
3.12.3 参数
--no-clean
:不清理build文件夹-w,--wheel-dir<dir>
:将wheels生成在dir中,默认当前文件夹--no-binary <format_control>
:不使用二进制包。--only-binary
:不适合用源包--prefer-binary
:优先旧包--build-option
:支持setup.py bdist_wheel
的额外参数--no-build-option
:当生成发布资源时,不使用独立包--use-pep517
:使用PEP517来进行构建包-c,--constraint <file>
:限制文件-e,--editable <path/URL>
:在editable模式下安装项目-r,--requirements <file>
:安装requirements中的包--src <dir>
:检查editable项目的文件夹--ignore-requires-python
:忽略Require-python信息--no-deps
:不安装依赖包-b,--build<dir>
:创建包的文件夹--progress-bar <progess_bar>
:以指定类型显示信息--global-option
:再调用bdist_wheel
命令前额外的全局项--require-hashes
:进行hash校验-i,--index-url<url>
:根据 url装包--extra-index-url
:-i补充--no-index
:忽略包索引-f,--find-links<url>
:如果是url或者路径,则会在指定的url或路径下寻找.tar.gz或.whl文件进行安装。如果是本地文件夹,则会在本地list中寻找
3.13 pip hash
3.13.1 使用方式
pip hash [options] <file>...
3.13.2 描述
计算本地包的hash值
3.13.3 参数
-a,--algorithm<algorithm>
:sha256、sha384、sha512
3.14 pip debug
3.12.1 使用方式
pip debug <option>
3.14.2 描述
显示debug信息
3.14.3 参数
--plantform<plantform>
:仅仅使用适合平台的wheel,默认情况下是当前运行的系统--python-version
:确定python解析器的版本(适合wheel的)--implementation<implementation>
:适合wheel的python实现方式--abi<abi>
:适合wheel的python abi
参考文献
[1] pip官网 https://pypi.org/project/pip/