前面的 Python Pip 基础教程 - 安装 我们详细介绍了如何安装 Pip
,别看文章好长,其实讲解的都是废话,因为当前最新的版本已经内置了 Pip
唠叨了一大堆废话,本章节我们来讲讲如何使用 pip
运行 pip
pip 是一个命令行程序,安装 pip 时,会向系统添加一个 pip
命令,该命令可以在命令提示符运行,如下所示
$ pip <pip arguments>
注意 : 美元符号 $
是命令行输入提示符,表示可以从这个位置输入一些命令
如果你在运行 pip
命令时报错了,原因可能是 pip 的安装位置不在操作系统的 PATH
上 ,那么可以通过Python 解释器运行 pip
$ python -m pip <pip arguments>
在 Windows 上,还可以使用 py
启动器
$ py -m pip <pip arguments>
pip 还可以作为一个可导入的模块 import pip
来使用,但我们强烈不建议以这种方式使用 pip
关于如何在 Python 代码中如何使用 pip
模块,可以参考 程序中使用 pip
安装第三方模块
pip 支持从从多种渠道安装第三方模块,比如 PyPI
,版本控制
,本地项目
以及分发文件
最常见的情况是使用 Requirement specifiers
从 PyPI 安装,也就是传说中的 requirements.txt
文件
安装最新的版本
$ pip install SomePackage
安装指定的版本
$ pip install SomePackage==1.0.4
安装最低的版本
$ pip install 'SomePackage>=1.0.4'
有关更多信息和示例,可以访问我们的 pip 安装参考
Requirements Files
「 Requirements Files 」是包含了要使用 pip install
命令安装的项目列表的文件,文件名一般为 requirements.txt
从 「 Requirements Files 」安装模块可以使用下面的命令
pip install -r requirements.txt
更多关于 requirements.txt
文件的格式,可以访问我们的 Requirements File Format
从逻辑上来说,Requirements 文件只是放在文件中的 pip 安装参数列表
请注意,当安装 Requirements 文件中的任意模块时,不应该依赖于 Requirements 中模块出现的先后顺序,也就是说,每个模块都应该自己安装依赖,且要避免出现重复依赖
实际上,Requirements 文件有四种用途
-
Requirements 文件用于保存
pip freeze
命令运行的结果,以达到重复安装的目的。在这种情况下,Requirements 文件包含了运行pip freeze
命令时所有固定版本的第三方模块pip freeze > requirements.txt pip install -r requirements.txt
-
Requirements 文件用于强制
pip
正确解析依赖项。截至目前为止,pip
并没有包含真正的依赖解析解决方案,而只是简单的使用它能找到的模块的第一个规范例如,如果
pkg1
依赖于pkg3 >= 1.0
并且pkg2
依赖于pkg3 >= 1.0,<= 2.0
。如果首先解析pkg1
,则 pip 将仅使用pkg3 >= 1.0
,这就很容易安装与pkg2
需求相冲突的pkg3
版本为了解决此问题,我们可以将
pkg3 >= 1.0, <= 2.0
( 即正确的规范 ) 作为一个单独的模块放入 Requirements 中pkg1 pkg2 pkg3>=1.0,<=2.0
-
Requirements 文件可以强制
pip
安装子依赖项的备用版本例如,假如我们 Requirements 文件中的
ProjectA
模块依赖ProjectB
,但ProjectB
最新的版本 (v1.3
) 有一个bug
。我们可以可以强制 pip 安装比当前最新版本低一个版本的ProjectB
ProjectA ProjectB<1.3
-
Requirements 文件可以使用本地版本控制器中的补丁来修补依赖关系
例如,假设一个依赖,从
PyPI
中安装的SomeDependency
有一个bug
,但我们又等不及上游的修复。我们可以克隆或复制源代码,作出修复,然后放在本地的版本控制器中并打上一个标签sometag
,接下来我们就可以在 Requirements 文件中使用下面的代码来引用它git+https://myvcs.com/some_dependency@sometag#egg=SomeDependency
- 如果
SomeDependency
以前在 Requirements 文件中是一个顶级依赖项,那么我们可以用上面这行代替它 - 如果
SomeDependency
是某个模块的子依赖项,则直接在新行处添加它即可
- 如果
不管怎么样,最重要的是明确 pip
使用 install_requires 元数据 来确定包依赖关系,而不是简单的通过项目中的 requirements.txt
文件
什么是 install_requires 元数据
?
就是模块中的 setup.py
的 requires
和 test_requirements
属性
就像 requests
中 setup.py
的那样
requires = [ 'chardet>=3.0.2,<3.1.0', 'idna>=2.5,<2.8', 'urllib3>=1.21.1,<1.24', 'certifi>=2017.4.17' ] test_requirements = ['pytest-httpbin==0.0.7', 'pytest-cov', 'pytest-mock', 'pytest-xdist', 'PySocks>=1.5.6, !=1.5.7', 'pytest>=2.8.0']
参考文档
约束文件
约束文件也是 Requirements 文件,但与 requirements.txt
不同的是,它仅用于控制安装哪个版本的模块,而不管该模块是否已经安装
约束文件的文件名一般为 constraints.txt
约束文件的语法和内容几乎与 Requirements 文件相同,只有一个关键区别
在约束文件中包含一个第三方包并不会触发该包的安装
当存在一个约束文件时,可以按照下面的命令来使用它
pip install -c constraints.txt
当我们不能确定要安装什么内容时,使用约束文件的理由看起来就和使用 requirements.txt
文件一样
例如,假设存在一个 helloworld
包,但该包在我们的环境中并不能正常使用,为此,我们必须有一个本地修补版本,但是呢,我们安装的某些包会依赖 helloworld
包,但另外一些则不依赖
要确保所有这些包一致使用修补版本的方法之一是手动审核您安装的所有内容的依赖关系,如果存在 「 helloworld 」,则添加一个该内容被安装时需要用到的 requirements.txt
文件
约束文件提供了一种更好的方法:我们可以为整个团队编写单个约束文件,并在任何地方使用它,如果要安装的东西需要安装 「 helloworld 」,则将使用约束文件中指定的固定版本
从 Wheels 中安装
「 Wheel 」是一种已经构建好的归档的格式,与从源代码归档中构建和安装相比,可以大大加快安装速度
关于 Wheel
的更多信息,可以参考 Wheel 文档 、PEP427 和 PEP425
当然了,这在早期带宽不足和机器性能不好的情况下非常好用,目前,很多时候,已经没有使用的必要了
Wheel 有很多值得期待的地方,Pip 也正是看中了这些优点,才会将 Wheel 作为其工具之一
如果要在 Pip 中禁用 Wheel,可以在安装 pip
的时候使用 --no-binary
命令行参数
pip install
一个第三方包时,默认会优先查找是否存在合适的 wheel
归档,如果不存在,才会查找相应的源代码归档
如果要直接从一个 wheel
归档中安装某个包,可以使用下面的命令
pip install SomePackage-1.0-py2.py3-none-any.whl
pip wheel
对于不存在的 wheel
,Pip 提供了 pip wheel
命令用来为所有的 requirements.txt
和依赖想构建一个 wheel
使用 pip wheel
构建一个本地的 wheel
的命令如下
pip install wheel pip wheel --wheel-dir=/local/wheels -r requirements.txt
然后就可以使用本地的 wheel
目录,而不是 PyPI
来安装一个 wheel
pip install --no-index --find-links=/local/wheels -r requirements.txt
卸载包 ( uninstall packages)
对于使用 pip
或 easy_install
安装的包,几乎都可以使用 pip uninstall
命令来卸载
$ pip uninstall SomePackage
pip 还会在升级到较新版本之前自动卸载旧版本的软件包
有关 pip uninstall
更多的信息和示例,可以访问 pip uninstall
列出安装的包
如果想要查看或列出已经安装的包,可以使用下面的命令
$ pip list
输出结果一般如下
docutils (0.9.1) Jinja2 (2.6) Pygments (1.5) Sphinx (1.1.2)
如果想要列出已经过期的包,且显示它们的可用的最新版本,可以使用下面的命令
$ pip list --outdated
显示结果一般如下
docutils (Current: 0.9.1 Latest: 0.10) Sphinx (Current: 1.1.2 Latest: 1.1.3)
如果想要查看某个包的详细信息,可以使用 pip show
命令
$ pip show sphinx
---
Name: Sphinx
Version: 1.1.3
Location: /my/env/lib/pythonx.x/site-packages
Requires: Pygments, Jinja2, docutils
有关 pip show
和 pip list
命令的更多详情,可以访问我们的 pip list
和 pip show
命令
搜索包
如果我们不知道某个包的确切名称,仅仅记得包名含有某个关键字,可以使用 pip search
命令
pip search "query"
pip search
命令会从 PyPI
中查找名称和简介中包含了 query
关键字的包
搜索结果一般如下
$ pip search query json-query (0.0.2) - JSON Query tools juju-query (0.0.1) - Juju query charmstore nameko-query (0.0.2) - Query extension for nameko. date-query (0.10.2) - A program to query dates graphite-query (0.11.3) - Utilities for querying graphite's database
有关更多 pip search
命令的详细信息,可以访问我们的 pip search
参考
结束语
我一开始给本章节取的名字是用户指南,后面一看,不对劲,想要写的信息太多了,所以,只能使用 日常使用 这几个字