用户指南

运行 pip

pip 是一个命令行程序。当您安装 pip 时,系统中会添加一个 pip 命令,可以从命令提示符中运行,如下所示

python -m pip <pip arguments>

python -m pip 使用您指定为 python 的 Python 解释器执行 pip。因此 /usr/bin/python3.7 -m pip 意味着您正在为位于 /usr/bin/python3.7 的解释器执行 pip。

py -m pip <pip arguments>

py -m pip 使用您安装的最新 Python 解释器执行 pip。有关更多详细信息,请阅读 Python Windows 启动器 文档。

安装软件包

pip 支持从 PyPI、版本控制、本地项目和直接从分发文件安装。

最常见的方案是使用 需求规范PyPI 安装。

python -m pip install SomePackage            # latest version
python -m pip install SomePackage==1.0.4     # specific version
python -m pip install 'SomePackage>=1.0.4'     # minimum version
py -m pip install SomePackage            # latest version
py -m pip install SomePackage==1.0.4     # specific version
py -m pip install 'SomePackage>=1.0.4'   # minimum version

有关更多信息和示例,请参见 pip install 参考。

基本身份验证凭据

现在已涵盖在 身份验证 中。

netrc 支持

现在已涵盖在 身份验证 中。

Keyring 支持

现在已涵盖在 身份验证 中。

使用代理服务器

PyPI 安装软件包时,pip 需要互联网访问权限,在许多企业环境中,这需要出站 HTTP 代理服务器。

pip 可以通过多种方式配置为通过代理服务器连接

  • 使用 --proxy 命令行选项以 scheme://[user:passwd@]proxy.server:port 的形式指定代理

  • 配置文件 中使用 proxy

  • 通过设置标准环境变量 http_proxyhttps_proxyno_proxy

  • 使用环境变量 PIP_USER_AGENT_USER_DATA 在 pip 请求中使用的用户代理变量中包含一个 JSON 编码字符串。

需求文件

“需求文件”是包含要使用 pip install 安装的项目列表的文件,如下所示

python -m pip install -r requirements.txt
py -m pip install -r requirements.txt

有关文件格式的详细信息,请参见:需求文件格式

从逻辑上讲,需求文件只是放置在文件中的 pip install 参数列表。请注意,您不应依赖 pip 以任何特定顺序安装文件中的项目。

需求文件也可以通过 URL 提供,例如 http://example.com/requirements.txt 而不是作为本地文件,这样它们可以存储和集中提供。

实际上,需求文件有 4 种常见用途

  1. 需求文件用于保存 pip freeze 的结果,以实现 可重复安装。在这种情况下,您的需求文件包含运行 pip freeze 时安装的所有内容的固定版本。

    python -m pip freeze > requirements.txt
    python -m pip install -r requirements.txt
    
    py -m pip freeze > requirements.txt
    py -m pip install -r requirements.txt
    
  2. 需求文件用于强制 pip 正确解析依赖关系。pip 20.2 及更早版本 没有真正的依赖关系解析,而是简单地使用它找到的第一个项目规范。例如,如果 pkg1 需要 pkg3>=1.0 并且 pkg2 需要 pkg3>=1.0,<=2.0,并且如果 pkg1 首先被解析,pip 将只使用 pkg3>=1.0,并且可能最终会安装与 pkg2 的需求冲突的 pkg3 版本。要解决此问题,您可以将 pkg3>=1.0,<=2.0(即正确的规范)直接与其他顶级需求一起放在需求文件中。如下所示

    pkg1
    pkg2
    pkg3>=1.0,<=2.0
    
  3. 需求文件用于强制 pip 安装子依赖关系的备用版本。例如,假设您需求文件中的 ProjectA 需要 ProjectB,但最新版本 (v1.3) 有一个错误,您可以强制 pip 接受较早的版本,如下所示

    ProjectA
    ProjectB<1.3
    
  4. 需求文件用于使用版本控制中存在的本地补丁覆盖依赖关系。例如,假设来自 PyPI 的依赖关系 SomeDependency 有一个错误,您无法等待上游修复。您可以克隆/复制 src,进行修复,并将其放置在带有标签 sometag 的 VCS 中。您将在您的需求文件中引用它,使用如下所示的一行

    git+https://myvcs.com/some_dependency@sometag#egg=SomeDependency
    

    如果 SomeDependency 之前是您需求文件中的顶级需求,那么 **替换** 那行。如果 SomeDependency 是一个子依赖关系,那么 **添加** 新行。

重要的是要清楚,pip 使用 install_requires 元数据 来确定软件包依赖关系,而不是通过发现项目中嵌入的 requirements.txt 文件来确定。

另见

约束文件

约束文件是只控制安装哪个版本的依赖关系的需求文件,而不是是否安装它。它们的语法和内容是 需求文件 的子集,不允许使用几种语法:约束必须有名称,它们不能是可编辑的,并且不能指定扩展。在语义方面,有一个关键的区别:将一个软件包包含在约束文件中不会触发该软件包的安装。

像这样使用约束文件

python -m pip install -c constraints.txt
py -m pip install -c constraints.txt

当您不知道要安装哪些内容时,约束文件与需求文件用于完全相同的原因。例如,假设“helloworld”软件包在您的环境中不起作用,因此您有一个本地修补版本。您安装的一些内容依赖于“helloworld”,而另一些则不依赖。

确保始终使用修补版本的一种方法是手动审核您安装的所有内容的依赖关系,如果存在“helloworld”,则编写一个在安装该内容时使用的需求文件。

约束文件提供了一种更好的方法:为您的组织编写一个约束文件并在任何地方使用它。如果正在安装的内容需要安装“helloworld”,那么您在约束文件中指定的修复版本将被使用。

约束文件支持是在 pip 7.1 中添加的。在 20.3(2020)中对 pip 依赖关系解析器的更改 中,我们进行了相当全面的检修,从先前实现中删除了几个未记录的和不受支持的怪癖,并将约束文件简化为纯粹的指定软件包的全局(版本)限制的方式。

与需求文件一样,约束文件也可以通过 URL 提供,例如 http://example.com/constraints.txt,这样您的组织就可以集中存储和提供它们。

从 Wheel 安装

“Wheel” 是一种构建的存档格式,与从源代码存档构建和安装相比,它可以极大地加快安装速度。有关更多信息,请参阅规范

pip 优先使用 Wheel,如果可用。要禁用此功能,请对 --no-binary 标志使用 pip install

如果找不到合适的 Wheel,pip 会默认查找源代码存档。

要直接从 Wheel 存档安装

python -m pip install SomePackage-1.0-py2.py3-none-any.whl
py -m pip install SomePackage-1.0-py2.py3-none-any.whl

要包含 Wheel 中 provides_extras 元数据提供的可选依赖项,必须在安装目标名称周围加上引号

python -m pip install './somepackage-1.0-py2.py3-none-any.whl[my-extras]'
py -m pip install './somepackage-1.0-py2.py3-none-any.whl[my-extras]'

注意

将来,path[extras] 语法可能会被弃用。建议尽可能使用标准 语法。

对于 Wheel 不可用 的情况,pip 提供了 pip wheel 作为一项便利,用于为所有需求和依赖项构建 Wheel。

pip wheel 需要安装 wheel 包,它提供它使用的“bdist_wheel” setuptools 扩展。

要为您的需求及其所有依赖项构建 Wheel 到本地目录

python -m pip install wheel
python -m pip wheel --wheel-dir=/local/wheels -r requirements.txt
py -m pip install wheel
py -m pip wheel --wheel-dir=/local/wheels -r requirements.txt

然后,要仅使用本地 Wheel 目录(而不是从 PyPI)安装这些需求

python -m pip install --no-index --find-links=/local/wheels -r requirements.txt
py -m pip install --no-index --find-links=/local/wheels -r requirements.txt

卸载包

pip 可以卸载大多数包,如下所示

python -m pip uninstall SomePackage
py -m pip uninstall SomePackage

pip 还会在升级到较新版本之前自动卸载旧版本的包。

有关更多信息和示例,请参阅 pip uninstall 参考。

列出包

要列出已安装的包

$ python -m pip list
docutils (0.9.1)
Jinja2 (2.6)
Pygments (1.5)
Sphinx (1.1.2)
C:\> py -m pip list
docutils (0.9.1)
Jinja2 (2.6)
Pygments (1.5)
Sphinx (1.1.2)

要列出过时的包并显示可用的最新版本

$ python -m pip list --outdated
docutils (Current: 0.9.1 Latest: 0.10)
Sphinx (Current: 1.1.2 Latest: 1.1.3)
C:\> py -m pip list --outdated
docutils (Current: 0.9.1 Latest: 0.10)
Sphinx (Current: 1.1.2 Latest: 1.1.3)

要显示有关已安装包的详细信息

$ python -m pip show sphinx
---
Name: Sphinx
Version: 1.1.3
Location: /my/env/lib/pythonx.x/site-packages
Requires: Pygments, Jinja2, docutils
C:\> py -m pip show sphinx
---
Name: Sphinx
Version: 1.1.3
Location: /my/env/lib/pythonx.x/site-packages
Requires: Pygments, Jinja2, docutils

有关更多信息和示例,请参阅 pip listpip show 参考页面。

搜索包

pip 可以使用 pip search 命令在 PyPI 上搜索包

python -m pip search "query"
py -m pip search "query"

查询将用于搜索所有包的名称和摘要。

有关更多信息和示例,请参阅 pip search 参考。

配置

现在在 配置 中介绍了这一点。

配置文件

现在在 配置 中介绍了这一点。

环境变量

现在在 配置 中介绍了这一点。

配置优先级

现在在 配置 中介绍了这一点。

命令完成

pip 附带了对 bash、zsh 和 fish 中的命令行完成的支持。

要为 bash 设置

python -m pip completion --bash >> ~/.profile

要为 zsh 设置

python -m pip completion --zsh >> ~/.zprofile

要为 fish 设置

python -m pip completion --fish > ~/.config/fish/completions/pip.fish

要为 powershell 设置

python -m pip completion --powershell | Out-File -Encoding default -Append $PROFILE

或者,您可以使用 completion 命令的结果直接与 shell 的 eval 函数一起使用,例如,通过将以下内容添加到您的启动文件中

eval "`pip completion --bash`"

从本地包安装

在某些情况下,您可能希望仅从本地包安装,而无需访问 PyPI。

首先,下载满足您的需求的存档

python -m pip download --destination-directory DIR -r requirements.txt
py -m pip download --destination-directory DIR -r requirements.txt

请注意,pip download 将首先查看您的 Wheel 缓存,然后再尝试从 PyPI 下载。如果您以前从未安装过您的需求,那么您将没有这些项目的 Wheel 缓存。在这种情况下,如果您的某些需求不是从 PyPI 作为 Wheel 获取的,并且您希望获得 Wheel,那么请改用以下命令

python -m pip wheel --wheel-dir DIR -r requirements.txt
py -m pip wheel --wheel-dir DIR -r requirements.txt

然后,要仅从本地安装,您将使用 --find-links--no-index,如下所示

python -m pip install --no-index --find-links=DIR -r requirements.txt
py -m pip install --no-index --find-links=DIR -r requirements.txt

“仅在需要时”递归升级

pip install --upgrade 现在有一个 --upgrade-strategy 选项,它控制 pip 如何处理依赖项的升级。支持 2 种升级策略

  • eager:无论依赖项是否仍满足新的父级需求,都会升级所有依赖项

  • only-if-needed:仅当依赖项不满足新的父级需求时才升级依赖项

默认策略是 only-if-needed。这在 pip 10.0 中更改,因为在升级冲突的依赖项时,eager 的性质发生了变化。

重要的是要注意,--upgrade 影响直接需求(例如,命令行或通过需求文件指定的那些),而 --upgrade-strategy 影响间接需求(直接需求的依赖项)。

例如,假设 SomePackage 具有一个依赖项 SomeDependency,并且它们都已安装,但不是最新的可用版本

  • pip install SomePackage:不会升级现有的 SomePackageSomeDependency

  • pip install --upgrade SomePackage:将升级 SomePackage,但不会升级 SomeDependency(除非未满足最低需求)。

  • pip install --upgrade SomePackage --upgrade-strategy=eager:升级 SomePackageSomeDependency

从历史角度来看,早期获得 only-if-needed 行为的“修复”是

python -m pip install --upgrade --no-deps SomePackage
python -m pip install SomePackage
py -m pip install --upgrade --no-deps SomePackage
py -m pip install SomePackage

正在考虑针对 upgrade-all 命令的建议,作为热切升级行为的更安全替代方案。

用户安装

Python 2.6 带来了“用户方案”用于安装,这意味着所有 Python 发行版都支持特定于用户的备用安装位置。每个操作系统的默认位置在 python 文档中为 site.USER_BASE 变量进行了说明。通过为 pip install 指定 --user 选项,可以启用此安装模式。

此外,可以通过设置 PYTHONUSERBASE 环境变量来定制“用户方案”,这将更新 site.USER_BASE 的值。

要将“SomePackage”安装到 site.USER_BASE 定制为“/myappenv”的环境中,请执行以下操作

export PYTHONUSERBASE=/myappenv
python -m pip install --user SomePackage
set PYTHONUSERBASE=c:/myappenv
py -m pip install --user SomePackage

pip install --user 遵循四条规则

  1. 当全局安装的包位于 python 路径上并且它们安装需求冲突时,它们将被忽略,不会被卸载。

  2. 当全局安装的包位于 python 路径上并且它们满足安装需求时,pip 不会执行任何操作,并报告需求已满足(类似于全局包如何在 --system-site-packages virtualenv 中安装包时满足需求)。

  3. pip 不会在 --no-site-packages virtualenv(即默认类型的 virtualenv)中执行 --user 安装,因为用户站点不在 python 路径上。安装将毫无意义。

  4. --system-site-packages virtualenv 中,pip 不会安装与 virtualenv site-packages 中的包冲突的包。--user 安装将缺乏 sys.path 优先级并且毫无意义。

为了使规则更清晰,以下是一些示例

--no-site-packages virtualenv(即默认类型)内部

$ python -m pip install --user SomePackage
Can not perform a '--user' install. User site-packages are not visible in this virtualenv.
C:\> py -m pip install --user SomePackage
Can not perform a '--user' install. User site-packages are not visible in this virtualenv.

--system-site-packages virtualenv 内部,其中 SomePackage==0.3 已安装在 virtualenv 中

$ python -m pip install --user SomePackage==0.4
Will not install to the user site because it will lack sys.path precedence
C:\> py -m pip install --user SomePackage==0.4
Will not install to the user site because it will lack sys.path precedence

从真正的 python 内部,其中 SomePackage全局安装

$ python -m pip install --user SomePackage
[...]
Successfully installed SomePackage
C:\> py -m pip install --user SomePackage
[...]
Successfully installed SomePackage

从真正的 python 内部,其中 SomePackage全局安装,但不是最新版本

$ python -m pip install --user SomePackage
[...]
Requirement already satisfied (use --upgrade to upgrade)
$ python -m pip install --user --upgrade SomePackage
[...]
Successfully installed SomePackage
C:\> py -m pip install --user SomePackage
[...]
Requirement already satisfied (use --upgrade to upgrade)
C:\> py -m pip install --user --upgrade SomePackage
[...]
Successfully installed SomePackage

从真正的 python 内部,其中 SomePackage全局安装,并且是最新版本

$ python -m pip install --user SomePackage
[...]
Requirement already satisfied (use --upgrade to upgrade)
$ python -m pip install --user --upgrade SomePackage
[...]
Requirement already up-to-date: SomePackage
# force the install
$ python -m pip install --user --ignore-installed SomePackage
[...]
Successfully installed SomePackage
C:\> py -m pip install --user SomePackage
[...]
Requirement already satisfied (use --upgrade to upgrade)
C:\> py -m pip install --user --upgrade SomePackage
[...]
Requirement already up-to-date: SomePackage
# force the install
C:\> py -m pip install --user --ignore-installed SomePackage
[...]
Successfully installed SomePackage

确保可重复性

现在在 可重复安装 中介绍了这一点。

修复冲突的依赖项

现在在 依赖项解析 中介绍了这一点。

从您的程序中使用 pip

如前所述,pip 是一个命令行程序。虽然它是在 Python 中实现的,因此可以通过 import pip 从您的 Python 代码中使用它,但您不能以这种方式使用 pip 的内部 API。有几个原因

  1. pip 代码假设它完全控制着程序的全局状态。pip 管理诸如日志系统配置或标准 IO 流的值之类的内容,而没有考虑用户代码可能会受到影响的可能性。

  2. pip 的代码不是线程安全的。如果你在某个线程中运行 pip,那么无法保证你的代码或 pip 的代码会按预期工作。

  3. pip 假设它完成工作后,进程就会终止。它不需要处理其他代码在该点之后继续运行的可能性,因此(例如)在同一个进程中两次调用 pip 可能会出现问题。

这并不意味着 pip 开发者原则上反对将 pip 用作库的想法——只是它不是这样编写的,并且需要大量工作才能重新设计内部结构以用作库,处理所有上述问题,并设计一个可使用、健壮且稳定的 API,我们可以保证它在多个 pip 版本中都可用。而我们目前根本没有资源来考虑这项任务。

实际上,这意味着 pip 内部的所有内容都被认为是实现细节。即使是导入名称为pip这一事实,也可能在未经通知的情况下发生变化。虽然我们尽量避免破坏东西,但所有内部 API 都可能随时、出于任何原因而发生变化。这也意味着,我们通常不会修复因以不受支持的方式使用 pip 而产生的问题。

还应注意,在运行的 Python 进程中将包安装到sys.path应该谨慎操作。导入系统会缓存某些数据,而程序运行期间安装新包可能不会像预期的那样运行。实际上,很少出现问题,但需要注意。

尽管有以上所有内容,但如果您决定要在程序中运行 pip,那么有必要了解可用的选项。最可靠的方法,也是唯一完全支持的方法,是在子进程中运行 pip。这可以使用标准的subprocess模块轻松完成

subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'my_package'])

如果要进一步处理输出,请使用模块中的其他 API 之一。这里我们使用的是freeze,它以需求格式输出已安装的包。

reqs = subprocess.check_output([sys.executable, '-m', 'pip', 'freeze'])

要以编程方式监控下载进度,请使用--progress-bar=raw选项。这将在标准输出中以Progress CURRENT of TOTAL格式打印行,其中CURRENTTOTAL是整数,单位是字节。如果不知道实际总数,则将TOTAL设置为0。请注意,pip 输出的具体格式保证在未来版本中保持一致。

如果您不想使用 pip 的命令行功能,而是尝试实现与 Python 包、其元数据或 PyPI 交互的代码,那么您应该考虑其他提供此类功能的支持的包。一些您可以考虑的示例包括

  • packaging - 用于处理标准包元数据(版本、需求等)的实用程序。

  • setuptools(特别是pkg_resources) - 用于查询用户在系统上安装了哪些包的功能。

  • distlib - 打包和分发实用程序(包括用于与 PyPI 交互的功能)。

20.3(2020 年)中 pip 依赖项解析器的更改

pip 20.3 拥有新的依赖项解析器,默认情况下针对 Python 3 用户启用。(pip 20.1 和 20.2 包含新的依赖项解析器的预发布版本,隐藏在可选用户标志后面。)请阅读以下内容,了解迁移指南、如何调用旧版解析器以及弃用时间线。我们还制作了一个时长两分钟的视频解释供您观看。

我们将根据测试人员的反馈继续改进 pip 依赖项解析器。请通过解析器测试调查向我们提供反馈。

注意

此版本中最大的变化是 pip 中的 pip 依赖项解析器。

计算机需要知道安装软件组件的正确顺序(“要安装x,您需要先安装y”)。因此,当 Python 程序员将软件共享为包时,他们必须精确地描述这些安装先决条件,并且 pip 需要处理它收到相互冲突的指令时的棘手情况。这个新的依赖项解析器将使 pip 在处理这些棘手的逻辑方面变得更好,并使 pip 更易于使用和排查故障。

解析器中最重要的更改是

  • 它将减少不一致性:它不再安装相互不一致的包组合。在旧版本的 pip 中,pip 可能安装一个不满足另一个已安装包的声明需求的包。例如,在 pip 20.0 中,pip install "six<1.12" "virtualenv==20.0.2" 执行了错误的操作,它“成功”地安装了 six==1.11,即使virtualenv==20.0.2需要six>=1.12.0,<2此处定义)。新的解析器将直接拒绝安装任何内容,如果它得到该输入。

  • 它将更严格 - 如果您要求 pip 安装两个具有不兼容需求的包,它将拒绝(而不是像以前版本那样安装一个损坏的组合)。

因此,如果您一直在使用解决方法来强制 pip 处理不兼容或不一致的需求组合,现在是修复包中底层问题的好时机,因为从现在起 pip 将更严格。

这也意味着,当您运行 pip install 命令时,pip 仅考虑您在该命令中安装的包,并可能会破坏已安装的包。它不会保证您的环境始终保持一致。如果您pip install x,然后pip install y,您获得的y版本可能与您在一个命令中运行pip install x y时获得的版本不同。我们正在考虑更改此行为(根据#7744),并希望您对 pip 的行为应该是什么给出意见;请回答我们关于导致冲突的升级的调查

我们还正在更改对约束文件、可编辑安装以及相关功能的支持。我们进行了相当全面的改革,并将约束文件简化为纯粹指定包的全局(版本)限制的方法,因此一些以前允许的组合现在会导致错误。具体来说

  • 约束不会覆盖现有需求;它们只是限制解析器可见的版本作为输入(请参阅#9020)。

  • 提供可编辑需求 (-e .) 不会导致 pip 忽略版本说明符或约束(请参阅#8076),如果您在固定需求和本地目录之间存在冲突,那么 pip 将指示它无法找到满足两者需求的版本(请参阅#8307)。

  • 哈希检查模式要求所有需求都指定为==与版本的匹配,并且可能与约束不兼容(请参阅#9020#8792)。

  • 如果需要满足约束,pip 将乐于重新安装包,升级或降级,而无需任何额外的命令行选项(请参阅#8115控制安装过程的选项)。

  • 无名需求不允许作为约束(请参阅#6628#8210)。

  • 链接不允许作为约束(请参阅#8253)。

  • 约束不能包含扩展 (extras)(请参阅#6628)。

根据我们的Python 2 支持策略,使用 Python 2 的 pip 20.3 用户将默认使用旧版解析器。使用 Python 2 的用户应尽快升级到 Python 3,因为在 2021 年 1 月的 pip 21.0 中,pip 完全放弃了对 Python 2 的支持。

如何升级和迁移

  1. 使用python -m pip install --upgrade pip安装 pip 20.3

  2. 通过运行pip check验证您当前的环境。这将报告您的已安装包集中是否存在任何不一致。拥有干净的安装将极大地降低您遇到新解析器问题的可能性(并且可能会解决当前环境中隐藏的问题!)。如果您运行pip check并遇到无法解决的问题,请在我们的问题跟踪器或聊天中寻求帮助

  3. 测试新版本的 pip.

    虽然我们已尽力确保 pip 的测试套件涵盖了尽可能多的用例,但我们非常清楚,有很多人使用 pip 并采用许多不同的工作流程和构建流程,如果没有您的帮助,我们将无法覆盖所有这些流程。

    • 如果您使用 pip 安装软件,请试用新的解析器,并使用pip install告诉我们它是否对您有效。尝试

      • 同时安装多个包

      • 使用 requirements.txt 文件重新创建环境

      • 使用pip install --force-reinstall检查它是否按预期工作

      • 使用约束文件

      • 以下的“需要特别关注的测试设置”和“尝试的示例”

    • 如果您有一个依赖于 pip 安装依赖项的构建管道,请检查新解析器是否满足您的需求。

    • 使用新解析器运行项目的 CI(测试套件、构建过程等),并告知我们任何问题。

    • 如果您以前遇到过 pip 的解析器问题,请检查新解析器是否已解决这些问题,并阅读 处理依赖冲突。此外,请告知我们新解析器是否对您为解决当前解析器限制而采取的任何解决方法存在问题。我们需要确保人们能够顺利过渡到这些解决方法。

    • 如果您开发或维护一个包装 pip 或使用它来提供部分功能的工具,请测试您的集成与 pip 20.3。

  4. 如有必要,进行故障排除并尝试这些解决方法。

    • 如果 pip 安装包需要更长时间,请阅读 依赖解析回溯,了解如何减少 pip 因依赖冲突而进行回溯所花费的时间。

    • 如果您不希望 pip 实际解析依赖项,请使用 --no-deps 选项。当您有一组在现实中可以一起工作的包版本时,即使它们的元数据表明它们存在冲突,这也很有用。有关长期解决方案的指南,请阅读 处理依赖冲突

    • 如果您遇到解析错误,并且在修复其根本原因时需要解决方法,您可以使用标志 --use-deprecated=legacy-resolver 选择旧的解析器行为。这将一直有效,直到我们发布 pip 21.0(请参阅 弃用时间表)。

  5. 请通过 解析器测试调查 报告错误。

需要特别关注的测试设置

  • 包含 100 多个包的需求文件

  • 涉及多个需求文件的安装工作流程

  • 包含哈希值 (哈希检查模式) 或固定依赖项(可能作为 pip-toolspip-compile 的输出)的需求文件

  • 使用 约束文件

  • 持续集成/持续部署设置

  • 从任何类型的版本控制系统(即 Git、Subversion、Mercurial 或 CVS)安装,根据 VCS 支持

  • 从本地目录中保存的源代码安装

尝试的示例

安装

  • tensorflow

  • hacking

  • pycodestyle

  • pandas

  • tablib

  • elasticsearchrequests 放在一起

  • sixcherrypy 放在一起

  • pip install flake8-import-order==0.17.1 flake8==3.5.0 --use-feature=2020-resolver

  • pip install tornado==5.0 sprockets.http==1.5.0 --use-feature=2020-resolver

尝试

  • pip install

  • pip uninstall

  • pip check

  • pip cache

告诉我们

我们非常乐意获得有关以下方面的反馈

  • 新解析器产生错误结果的情况,很明显。我们希望不会出现太多这种情况,但我们希望在删除旧解析器之前找到此类错误。

  • 解析器在您认为它应该能够解决问题的情况下产生错误的情况。

  • 解析器因您的需求存在问题而导致错误,但您需要更多信息才能确定错误所在的情况。

  • 如果您有解决方法来解决当前解析器的问题,新解析器是否允许您删除这些解决方法?告诉我们!

请通过 解析器测试调查 告知我们。

弃用时间表

我们计划使用 功能标志 并遵循我们的 发布节奏,按照以下步骤进行解析器转换。

  • pip 20.1:新解析器的 alpha 版本可用,可选择使用可选标志 --unstable-feature=resolver。pip 默认使用旧的行为。

  • pip 20.2:新解析器的 beta 版本可用,可选择使用标志 --use-feature=2020-resolver。pip 默认使用旧的行为。希望 pip 默认使用新解析器的 pip 20.2 用户可以运行 pip config set global.use-feature 2020-resolver(有关该方法以及备用 PIP_USE_FEATURE 环境变量选项的更多信息,请参阅 问题 8661)。

  • pip 20.3:在 Python 3 环境中,pip 默认使用新解析器,但用户可以选择退出并选择旧的解析器行为,使用标志 --use-deprecated=legacy-resolver。在 Python 2 环境中,pip 默认使用旧解析器,可以使用标志 --use-feature=2020-resolver 使用新解析器。

  • pip 21.0:pip 默认使用新解析器,旧解析器不再受支持。它将在目前尚未确定的时间段后删除,因为删除时间取决于 pip 的志愿维护者的可用性。根据我们的 Python 2 支持 策略,Python 2 支持将被移除。

由于此工作不会更改 pip 文档中描述的用户可见行为,因此此更改不受 弃用策略 的约束。

注意

旧解析器已弃用且不受支持。新功能,如 安装报告,将无法与旧解析器一起使用,并且该解析器将在将来的版本中删除。

上下文和后续操作

正如 我们在 PSF 博客上发布的公告 中所讨论的,pip 团队正在开发一个新的“依赖解析器”(pip 中用于根据您的需求确定要安装内容的部分)。

我们在 #6536 中跟踪我们的发布过程,您可以在 流量较少的打包发布列表官方 Python 博客 上关注我们的发布公告。

使用系统信任库验证 HTTPS

现在已包含在 HTTPS 证书 中。