geekdoc-python-zh/docs/realpython/what-is-pip.md

39 KiB
Raw Permalink Blame History

使用 Python 的 pip 管理项目的依赖关系

原文:https://realpython.com/what-is-pip/

*立即观看**本教程有真实 Python 团队创建的相关视频课程。和文字教程一起看,加深理解:Pip 入门

Python 的标准包管理器是 pip 。它允许你安装和管理不属于 Python 标准库的包。如果你正在寻找关于pip的介绍,那么你来对地方了!

在本教程中,您将学习如何:

  • 在您的工作环境中设置pip
  • 修复与使用pip相关的常见错误
  • pip安装和卸载软件包
  • 使用需求文件管理项目的依赖关系

您可以使用pip做很多事情,但是 Python 社区非常活跃,已经创建了一些简洁的替代方案来代替pip。您将在本教程的后面部分了解这些内容。

免费奖励: 掌握 Python 的 5 个想法,这是一个面向 Python 开发者的免费课程,向您展示将 Python 技能提升到下一个水平所需的路线图和心态。

pip 入门

那么,pip到底是做什么的呢? pip 是 Python 的一个包管理器。这意味着它是一个工具,允许您安装和管理不作为标准库的一部分分发的库和依赖项。伊恩·比克在 2008 年引入了 pip 这个名字:

我已经将 pyinstall 重命名为新名称:pip。pip 这个名字是一个缩写和声明:pip 安装软件包。(来源)

包管理是如此重要,以至于 Python 的安装程序从版本 3.4 和 2.7.9 开始就包含了pip,分别针对 Python 3 和 Python 2。许多 Python 项目使用pip,这使得它成为每个 Python 爱好者的必备工具。

如果您来自另一种编程语言,那么您可能对包管理器的概念很熟悉。 JavaScript 使用 npm 进行包管理, Ruby 使用 gem ,而。NET 平台使用 NuGet 。在 Python 中,pip已经成为标准的包管理器。

Remove ads

在您的系统上找到pip

在您的系统上安装 Python 时Python 3 安装程序为您提供了安装pip的选项。事实上,用 Python 安装pip的选项是默认勾选的,所以安装完 Python 后pip应该就可以使用了。

**注意:**在 Ubuntu 等一些 Linux (Unix)系统上,pip是一个名为python3-pip的单独的包,你需要用sudo apt install python3-pip来安装。默认情况下,它不会随解释器一起安装。

您可以通过在您的系统上查找pip3可执行文件来验证pip是否可用。从下面选择您的操作系统,并相应地使用特定于平台的命令:

C:\> where pip3

Windows 上的where命令会告诉你在哪里可以找到pip3的可执行文件。如果 Windows 找不到名为pip3的可执行文件,那么你也可以尝试寻找末尾没有三个(3)的pip

$ which pip3

Linux 系统和 macOS 上的which命令显示了pip3二进制文件的位置。

在 Windows 和 Unix 系统中,pip3可能位于多个位置。当您安装了多个 Python 版本时,可能会发生这种情况。如果您在系统的任何位置都找不到pip,那么您可以考虑重新安装 pip

除了直接运行您的系统pip,您还可以将它作为 Python 模块来运行。在下一节中,您将了解如何操作。

pip作为模块运行

当你直接运行你的系统pip时,命令本身并不会透露pip属于哪个 Python 版本。不幸的是,这意味着您可以使用pip将一个包安装到旧 Python 版本的站点包中,而不会注意到。为了防止这种情况发生,您可以将pip作为 Python 模块运行:

$ python3 -m pip

注意,您使用了python3 -m来运行pip-m开关告诉 Python 运行一个模块作为python3解释器的可执行文件。这样,您可以确保您的系统默认 Python 3 版本运行pip命令。如果你想进一步了解这种运行pip的方式,那么你可以阅读 Brett Cannon 关于使用python3 -m pip 的优势的颇有见地的文章。

有时您可能想要更明确地将包限制在特定的项目中。在这种情况下,你应该在一个虚拟环境中运行pip

在 Python 虚拟环境中使用pip

为了避免将包直接安装到您的系统 Python 安装中,您可以使用一个虚拟环境。虚拟环境为您的项目提供了一个独立的 Python 解释器。您在这个环境中使用的任何包都将独立于您的系统解释器。这意味着您可以将项目的依赖项与其他项目和整个系统分开。

在虚拟环境中使用pip有三个主要优势。您可以:

  1. 确保您正在为手头的项目使用正确的 Python 版本
  2. 确信你在运行pippip3时引用的是正确的pip实例
  3. 在不影响其他项目的情况下,为您的项目使用一个特定的包版本

Python 3 内置了 venv 模块,用于创建虚拟环境。本模块帮助您使用独立的 Python 安装创建虚拟环境。一旦激活了虚拟环境,就可以将软件包安装到该环境中。您安装到一个虚拟环境中的软件包与系统上的所有其他环境是隔离的。

您可以按照以下步骤创建一个虚拟环境,并验证您在新创建的环境中使用了pip模块:

C:\> python -m venv venv
C:\> venv\Scripts\activate.bat
(venv) C:\>  pip3 --version
pip 21.2.3 from ...\lib\site-packages\pip (python 3.10)
(venv) C:\>  pip --version
pip 21.2.3 from ...\lib\site-packages\pip (python 3.10)
$ python3 -m venv venv
$ source venv/bin/activate
(venv) $ pip3 --version
pip 21.2.3 from .../python3.10/site-packages/pip (python 3.10)
(venv) $ pip --version
pip 21.2.3 from .../python3.10/site-packages/pip (python 3.10)

在这里,您通过使用 Python 的内置venv模块创建一个名为venv的虚拟环境。然后你用source命令激活它。您的venv名字周围的括号(())表示您成功激活了虚拟环境。

最后,检查激活的虚拟环境中的pip3pip可执行文件的版本。两者都指向同一个pip模块,所以一旦你的虚拟环境被激活,你可以使用pip或者pip3

Remove ads

出现错误时重新安装pip

当运行pip命令时,在某些情况下可能会出现错误。具体的错误消息取决于您的操作系统:

操作系统 出错信息
Windows 操作系统 'pip' is not recognized as an internal or external command,
T1】
Linux 操作系统 bash: pip: command not found
马科斯 zsh: command not found: pip

类似这样的错误消息表明pip的安装出现了问题。

**注意:**当pip命令不起作用时,在您开始任何故障排除之前,您可以尝试使用结尾带有三个(3)的pip3命令。

得到如上所示的错误可能会令人沮丧,因为pip对于安装和管理外部包是至关重要的。pip的一些常见问题与该工具在您的系统上的安装方式有关。

尽管不同系统的错误信息不同,但它们都指向同一个问题:您的系统无法在您的 PATH 变量中列出的位置找到pip。在 Windows 上,PATH系统变量的一部分。在 macOS 和 Linux 上,PATH环境变量的一部分。你可以用这个命令检查你的PATH变量的内容:

C:\> echo %PATH%
$ echo $PATH

该命令的输出将显示操作系统在磁盘上查找可执行程序的位置(目录)列表。根据您的系统,位置可以用冒号(:)或分号(;)分隔。

默认情况下,在安装 Python 或创建虚拟环境之后,包含pip可执行文件的目录应该出现在PATH中。然而,失踪的pip是一个常见的问题。两个支持的方法可以帮助你再次安装pip并将其添加到你的PATH中:

  1. ensurepip 模块
  2. get-pip.py 剧本

从 Python 3.4 开始,ensurepip模块就是标准库的一部分。它被添加到中,为你重新安装pip提供了一种直接的方式,例如,如果你在安装 Python 时跳过了它或者在某个时候卸载了pip。在下面选择您的操作系统,并相应地运行ensurepip:

C:\> python -m ensurepip --upgrade
$ python3 -m ensurepip --upgrade

如果pip还没有安装,那么这个命令会将它安装到您当前的 Python 环境中。如果您在一个活动的虚拟环境中,那么该命令会将pip安装到该环境中。否则,它会在你的系统上全局安装pip--upgrade选项确保pip版本与ensurepip中声明的版本相同。

注意:ensurepip模块不接入互联网。ensurepip可以安装的最新版本的pip是捆绑在您环境的 Python 安装中的版本。比如用 Python 3.10.0 运行ensurepip,安装pip 21.2.3。如果你想要一个更新的pip版本,那么你需要首先运行ensurepip。之后,您可以手动将pip更新到其最新版本。

另一种修复pip安装的方法是使用get-pip.py脚本。get-pip.py文件包含一个完整的pip副本,作为一个编码的 ZIP 文件。你可以直接从 PyPA 引导页面下载get-pip.py。一旦你在你的机器上有了脚本,你就可以像这样运行 Python 脚本:

C:\> python get-pip.py
$ python3 get-pip.py

该脚本将在您当前的 Python 环境中安装最新版本的pipsetuptoolswheel。如果您只想安装pip,那么您可以在您的命令中添加--no-setuptools--no-wheel选项。

如果以上方法都不起作用,那么可能值得尝试为您当前的平台下载最新的 Python 版本。你可以按照 Python 3 安装&设置指南来确保pip被正确安装并且工作无误。

Remove ads

pip 安装包

Python 被认为是一门包含电池的语言。这意味着 Python 标准库包含了一套广泛的包和模块来帮助开发者完成他们的编码项目。

同时Python 有一个活跃的社区,它提供了一组更广泛的包,可以帮助您满足开发需求。这些包被发布到 Python 包索引,也称为 PyPI (读作派豌豆眼)。

PyPI 托管了大量的包,包括开发框架、工具和库。其中许多包都提供了 Python 标准库功能的友好接口。

使用 Python 包索引(PyPI)

PyPI 托管的众多包中有一个叫做 requestsrequests库通过抽象 HTTP 请求的复杂性来帮助与 web 服务交互。你可以在官方的文档网站上了解关于requests的一切。

当您想在项目中使用requests包时,您必须首先将它安装到您的环境中。如果您不想将它安装在您的系统 Python 站点包中,那么您可以首先创建一个虚拟环境,如上所示。

一旦创建并激活了虚拟环境,命令行提示符就会在括号中显示虚拟环境的名称。从现在起,您执行的任何pip命令都将发生在您的虚拟环境中。

为了安装软件包,pip提供了一个install命令。你可以运行它来安装requests包:

(venv) C:\> python -m pip install requests
(venv) $ python3 -m pip install requests

在这个例子中,您运行pip,带有install命令,后跟您想要安装的软件包的名称。pip命令在 PyPI 中寻找包,解析它的依赖项,并在当前的 Python 环境中安装所有东西,以确保requests能够工作。

pip install <package>命令总是寻找软件包的最新版本并安装它。它还搜索软件包元数据中列出的依赖项并安装它们,以确保软件包具有它需要的所有要求。

也可以在一个命令中安装多个软件包:

(venv) C:\> python -m pip install rptree codetiming
(venv) $ python3 -m pip install rptree codetiming

通过在pip install命令中链接软件包rptreecodetiming,你可以一次安装两个软件包。您可以向pip install命令添加任意数量的包。在这种情况下,一个requirements.txt文件可以派上用场。在本教程的后面,您将学习如何使用一个requirements.txt文件一次安装多个包。

**注意:**除非软件包的具体版本号与本教程相关,否则您会注意到版本字符串采用了x.y.z的通用形式。这是一种占位符格式,可以代表3.1.42.9或任何其他版本号。当您继续操作时,终端中的输出将显示您实际的包版本号。

您可以使用list命令来显示您的环境中安装的软件包,以及它们的版本号:

(venv) C:\> python -m pip list
Package            Version
------------------ ---------
certifi            x.y.z
charset-normalizer x.y.z
codetiming         x.y.z
idna               x.y.z
pip                x.y.z
requests           x.y.z
rptree             x.y.z
setuptools         x.y.z
urllib3            x.y.z
(venv) $ python3 -m pip list
Package            Version
------------------ ---------
certifi            x.y.z
charset-normalizer x.y.z
idna               x.y.z
pip                x.y.z
requests           x.y.z
setuptools         x.y.z
urllib3            x.y.z

pip list命令呈现一个表格,显示当前环境中所有已安装的软件包。上面的输出显示了使用x.y.z占位符格式的包的版本。当您在您的环境中运行pip list命令时,pip会显示您为每个包安装的特定版本号。

要获得关于特定包的更多信息,您可以通过使用pip中的show命令来查看包的元数据:

(venv) C:\> python -m pip show requests
Name: requests
Version: x.y.z
Summary: Python HTTP for Humans.
 ...
Requires: certifi, idna, charset-normalizer, urllib3
Required-by:
(venv) $ python3 -m pip show requests
Name: requests
Version: x.y.z
Summary: Python HTTP for Humans.
 ...
Requires: certifi, idna, charset-normalizer, urllib3
Required-by:

您系统上的这个命令的输出将列出包的元数据。Requires行列出了包,比如certifiidnacharset-normalizerurllib3。安装这些是因为requests依赖它们才能正常工作。

既然已经安装了requests及其依赖项,就可以像 Python 代码中的任何其他常规包一样导入了。启动交互式 Python 解释器,导入requests包;

>>> import requests
>>> requests.__version__
"x.y.z"

启动交互式 Python 解释器后,您导入了requests模块。通过调用requests.__version__,您验证了您正在虚拟环境中使用requests模块。

Remove ads

使用自定义包索引

默认情况下,pip使用 PyPI 来查找包。但是pip也给了你定义自定义包索引的选项。

当 PyPI 域在您的网络上被阻止时,或者如果您想使用不公开的包,使用带有自定义索引的pip会很有帮助。有时系统管理员也会创建他们自己的内部包索引,以便更好地控制哪些包版本对公司网络上的pip用户可用。

自定义包索引必须符合PEP 503简单存储库 API 才能与pip一起工作。您可以通过访问 PyPI 简单索引来了解这样一个 API(应用程序编程接口)是什么样子的——但是要注意这是一个很大的页面,有很多难以解析的内容。任何遵循相同 API 的定制索引都可以使用--index-url选项。除了键入--index-url,你还可以使用-i速记。

例如,要从 TestPyPI 包索引中安装 rptree 工具,可以运行以下命令:

(venv) C:\> python -m pip install -i https://test.pypi.org/simple/ rptree
(venv) $ python3 -m pip install -i https://test.pypi.org/simple/ rptree

使用-i选项,您告诉pip查看不同的包索引,而不是默认的 PyPI。这里你是从 TestPyPI 而不是从 PyPI 安装rptree。您可以使用 TestPyPI 来微调 Python 包的发布过程,而不会弄乱 PyPI 上的产品包索引。

如果需要永久使用替代索引,那么可以在pip 配置文件中设置index-url选项。这个文件叫做pip.conf,您可以通过运行以下命令找到它的位置:

(venv) C:\> python -m pip config list -vv
(venv) $ python3 -m pip config list -vv

使用pip config list命令,您可以列出活动配置。只有当您设置了自定义配置时,此命令才会输出一些内容。否则,输出为空。这时,附加的--verbose-vv选项会有所帮助。当您添加-vvpip会向您显示它在哪里寻找不同的配置级别。

如果你想添加一个pip.conf文件,那么你可以选择一个pip config list -vv列出的位置。带有自定义包索引的pip.conf文件如下所示:

# pip.conf

[global]
index-url = https://test.pypi.org/simple/

当你有一个像这样的pip.conf文件时,pip将使用定义好的index-url来寻找包。有了这个配置,您不需要在您的pip install命令中使用--index-url选项来指定您只想要可以在 TestPyPI 的简单 API 中找到的包。

从你的 GitHub 库安装包

您不局限于托管在 PyPI 或其他包索引上的包。pip还提供了从 GitHub 库安装包的选项。但是即使一个包托管在 PyPI 上,比如真正的 Python 目录树生成器,你也可以选择从它的 Git 库安装它:

(venv) C:\> python -m pip install git+https://github.com/realpython/rptree
(venv) $ python3 -m pip install git+https://github.com/realpython/rptree

使用git+https方案,您可以指向包含可安装包的 Git 存储库。您可以通过运行交互式 Python 解释器并导入rptree来验证您是否正确安装了包:

>>> import rptree
>>> rptree.__version__
"x.y.z"

启动交互式 Python 解释器后,导入rptree模块。通过调用rptree.__version__,您验证了您正在使用基于虚拟环境的rptree模块。

**注意:**如果你使用的是版本控制系统(VCS)而不是 Gitpip你已经覆盖了。要了解如何将pip与 Mercurial、Subversion 或 Bazaar 一起使用,请查看pip文档的 VCS 支持章节

如果包不是托管在 PyPI 上,而是有一个远程 Git 存储库,那么从 Git 存储库安装包会很有帮助。您指向的远程存储库甚至可以托管在您公司内部网的内部 Git 服务器上。当您处于防火墙之后或 Python 项目有其他限制时,这可能会很有用。

Remove ads

以可编辑模式安装软件包以简化开发

当处理您自己的包时,以可编辑的模式安装它是有意义的。通过这样做,您可以在处理源代码的同时仍然像在任何其他包中一样使用命令行。典型的工作流程是首先克隆存储库,然后使用pip将其作为可编辑的包安装到您的环境中:

 1C:\> git clone https://github.com/realpython/rptree
 2C:\> cd rptree
 3C:\rptree> python3 -m venv venv
 4C:\rptree> venv\Scripts\activate.bat
 5(venv) C:\rptree> python -m pip install -e .
 1$ git clone https://github.com/realpython/rptree
 2$ cd rptree
 3$ python3 -m venv venv
 4$ source venv/bin/activate
 5(venv) $ python3 -m pip install -e .

使用上面的命令,您安装了作为可编辑模块的rptree包。以下是您刚刚执行的操作的详细步骤:

  1. 第 1 行克隆了rptree包的 Git 库。
  2. 第 2 行将工作目录更改为rptree/
  3. 第 3 行和第 4 行创建并激活了一个虚拟环境。
  4. 第 5 行将当前目录的内容安装为可编辑包。

-e选项是--editable选项的简写。当你使用-e选项和pip install时,你告诉pip你想在可编辑模式下安装软件包。不使用包名,而是使用一个点(.)将pip指向当前目录。

如果您没有使用-e标志,pip将会把这个包正常安装到您环境的site-packages/文件夹中。当您在可编辑模式下安装软件包时,您会在站点软件包中创建一个到本地项目路径的链接:

 ~/rptree/venv/lib/python3.10/site-packages/rptree.egg-link

使用带有-e标志的pip install命令只是pip install提供的众多选项之一。你可以在pip文档中查看 pip install示例。在那里你将学习如何安装一个包的特定版本,或者将pip指向一个不同的不是 PyPI 的索引。

在下一节中,您将了解需求文件如何帮助您的pip工作流。

使用需求文件

pip install命令总是安装软件包的最新发布版本,但是有时您的代码需要特定的软件包版本才能正常工作。

您希望创建用于开发和测试应用程序的依赖项和版本的规范,以便在生产中使用应用程序时不会出现意外。

固定要求

当您与其他开发人员共享 Python 项目时,您可能希望他们使用与您相同版本的外部包。也许某个软件包的特定版本包含了您所依赖的新特性,或者您正在使用的软件包版本与以前的版本不兼容。

这些外部依赖也被称为需求。您经常会发现 Python 项目将它们的需求固定在一个名为requirements.txt或类似的文件中。需求文件格式允许您精确地指定应该安装哪些包和版本。

运行pip help显示有一个freeze命令以需求格式输出已安装的包。您可以使用这个命令,将输出重定向到一个文件来生成一个需求文件:

(venv) C:\> python -m pip freeze > requirements.txt
(venv) $ python3 -m pip freeze > requirements.txt

该命令在您的工作目录中创建一个包含以下内容的requirements.txt文件:

certifi==x.y.z
charset-normalizer==x.y.z
idna==x.y.z
requests==x.y.z
urllib3==x.y.z

记住上面显示的x.y.z是包版本的占位符格式。您的requirements.txt文件将包含真实的版本号。

freeze命令将当前安装的软件包的名称和版本转储到标准输出中。您可以将输出重定向到一个文件,稍后您可以使用该文件将您的确切需求安装到另一个系统中。您可以随意命名需求文件。然而,一个广泛采用的惯例是将其命名为requirements.txt

当您想要在另一个系统中复制环境时,您可以运行pip install,使用-r开关来指定需求文件:

(venv) C:\> python -m pip install -r requirements.txt
(venv) $ python3 -m pip install -r requirements.txt

在上面的命令中,您告诉piprequirements.txt中列出的包安装到您当前的环境中。包版本将匹配requirements.txt文件包含的版本约束。您可以运行pip list来显示您刚刚安装的包,以及它们的版本号:

(venv) C:\> python -m pip list

Package            Version
------------------ ---------
certifi            x.y.z
charset-normalizer x.y.z
idna               x.y.z
pip                x.y.z
requests           x.y.z
setuptools         x.y.z
urllib3            x.y.z
(venv) $ python3 -m pip list

Package            Version
------------------ ---------
certifi            x.y.z
charset-normalizer x.y.z
idna               x.y.z
pip                x.y.z
requests           x.y.z
setuptools         x.y.z
urllib3            x.y.z

现在,您可以分享您的项目了!您可以将requirements.txt提交到 Git 这样的版本控制系统中,并使用它在其他机器上复制相同的环境。但是等等,如果这些包发布了新的更新会怎么样呢?

Remove ads

微调要求

硬编码软件包的版本和依赖关系的问题是,软件包会频繁地更新错误和安全补丁。您可能希望这些更新一发布就加以利用。

需求文件格式允许您使用比较操作符来指定依赖版本,这为您提供了一些灵活性,以确保在定义包的基本版本的同时更新包。

在您最喜欢的编辑器中打开requirements.txt,将等式运算符(==)转换为大于或等于运算符(>=,如下例所示:

# requirements.txt

certifi>=x.y.z
charset-normalizer>=x.y.z
idna>=x.y.z
requests>=x.y.z
urllib3>=x.y.z

您可以将比较运算符改为>=来告诉pip安装一个已经发布的精确或更高版本。当您使用requirements.txt文件设置一个新环境时,pip会寻找满足需求的最新版本并安装它。

接下来,您可以通过运行带有--upgrade开关或-U速记的install命令来升级您的需求文件中的包:

(venv) C:\> python -m pip install -U -r requirements.txt
(venv) $ python3 -m pip install -U -r requirements.txt

如果列出的软件包有新版本可用,则该软件包将被升级。

在理想的情况下,新版本的包应该是向后兼容的,并且不会引入新的错误。不幸的是,新版本可能会引入一些会破坏应用程序的变化。为了微调您的需求,需求文件语法支持额外的版本说明符

假设requests的一个新版本3.0已经发布,但是引入了一个不兼容的变更,导致应用程序崩溃。您可以修改需求文件以防止安装3.0或更高版本:

# requirements.txt

certifi==x.y.z
charset-normalizer==x.y.z
idna==x.y.z
requests>=x.y.z, <3.0 urllib3==x.y.z

更改requests包的版本说明符可以确保任何大于或等于3.0的版本都不会被安装。pip文档提供了关于需求文件格式的大量信息,你可以参考它来了解更多。

分离生产和开发依赖关系

并非所有在应用程序开发过程中安装的包都是生产依赖项。例如,您可能想要测试您的应用程序,因此您需要一个测试框架。一个流行的测试框架是 pytest 。您希望将它安装在您的开发环境中,但不希望将其安装在您的生产环境中,因为它不是生产依赖项。

您创建了第二个需求文件requirements_dev.txt,列出了设置开发环境的附加工具:

# requirements_dev.txt

pytest>=x.y.z

拥有两个需求文件将要求你使用pip来安装它们,requirements.txtrequirements_dev.txt。幸运的是,pip允许您在需求文件中指定额外的参数,因此您可以修改requirements_dev.txt来安装来自生产requirements.txt文件的需求:

# requirements_dev.txt

-r requirements.txt
pytest>=x.y.z

注意,您使用同一个-r开关来安装生产requirements.txt文件。现在,在您的开发环境中,您只需运行这个命令就可以安装所有需求:

(venv) C:\> python -m pip install -r requirements_dev.txt
(venv) $ python3 -m pip install -r requirements_dev.txt

因为requirements_dev.txt包含了-r requirements.txt行,所以您不仅要安装pytest,还要安装requirements.txt的固定需求。在生产环境中,只安装生产需求就足够了:

(venv) C:\> python -m pip install -r requirements.txt
(venv) $ python3 -m pip install -r requirements.txt

使用这个命令,您可以安装requirements.txt中列出的需求。与您的开发环境相比,您的生产环境不会安装pytest

Remove ads

生产冻结要求

您创建了生产和开发需求文件,并将它们添加到源代码控制中。这些文件使用灵活的版本说明符来确保您利用由您的依赖项发布的错误修复。您还测试了您的应用程序,现在准备将它部署到生产环境中。

您知道所有的测试都通过了,并且应用程序使用了您在开发过程中使用的依赖项,因此您可能希望确保您将相同版本的依赖项部署到生产环境中。

当前的版本说明符不能保证相同的版本将被部署到生产中,所以您希望在发布项目之前冻结生产需求。

在您根据当前需求完成开发之后,创建当前项目的新版本的工作流可能如下所示:

步骤 命令 说明
one pytest 运行您的测试并验证您的代码工作正常。
Two pip install -U -r requirements.txt 将您的需求升级到与您的requirements.txt文件中的约束相匹配的版本。
three pytest 运行您的测试,并考虑降级任何给代码带来错误的依赖项。
four pip freeze > requirements_lock.txt 一旦项目正常工作,将依赖关系冻结到一个requirements_lock.txt文件中。

有了这样的工作流,requirements_lock.txt文件将包含精确的版本说明符,并可用于复制您的环境。您已经确保当您的用户将requirements_lock.txt中列出的软件包安装到他们自己的环境中时,他们将使用您希望他们使用的版本。

冻结您的需求是确保您的 Python 项目在您的用户环境中与在您的环境中一样工作的重要一步。

pip 卸载软件包

偶尔,你需要卸载一个软件包。要么你找到了更好的库来代替它,要么它是你不需要的东西。卸载软件包可能有点棘手。

请注意,当您安装了requests时,您也让pip安装其他依赖项。安装的软件包越多,多个软件包依赖于同一个依赖项的可能性就越大。这就是pip中的show命令派上用场的地方。

在卸载软件包之前,请确保运行该软件包的show命令:

(venv) C:\> python -m pip show requests

Name: requests
Version: 2.26.0
Summary: Python HTTP for Humans.
Home-page: https://requests.readthedocs.io
Author: Kenneth Reitz
Author-email: me@kennethreitz.org
License: Apache 2.0
Location: .../python3.9/site-packages
Requires: certifi, idna, charset-normalizer, urllib3 Required-by:
(venv) $ python3 -m pip show requests

Name: requests
Version: 2.26.0
Summary: Python HTTP for Humans.
Home-page: https://requests.readthedocs.io
Author: Kenneth Reitz
Author-email: me@kennethreitz.org
License: Apache 2.0
Location: .../python3.9/site-packages
Requires: certifi, idna, charset-normalizer, urllib3 Required-by:

注意最后两个字段,RequiresRequired-byshow命令告诉你requests需要certifiidnacharset-normalizerurllib3。你可能也想卸载它们。注意requests不是任何其他包所必需的。所以卸载它是安全的。

您应该对所有的requests依赖项运行show命令,以确保没有其他库也依赖于它们。一旦理解了要卸载的软件包的依赖顺序,就可以使用uninstall命令删除它们:

(venv) C:\> python -m pip uninstall certifi
(venv) $ python3 -m pip uninstall certifi

uninstall命令显示将要删除的文件并要求确认。如果您确定要删除这个包,因为您已经检查了它的依赖关系,并且知道没有其他东西在使用它,那么您可以传递一个-y开关来抑制文件列表和确认对话框:

(venv) C:\> python -m pip uninstall urllib3 -y
(venv) $ python3 -m pip uninstall urllib3 -y

这里你卸载urllib3。使用-y开关,您抑制询问您是否要卸载该软件包的确认对话框。

在一次调用中,您可以指定要卸载的所有软件包:

(venv) C:\> python -m pip uninstall -y charset-normalizer idna requests
(venv) $ python3 -m pip uninstall -y charset-normalizer idna requests

您可以向pip uninstall命令传递多个包。如果您没有添加任何额外的开关,那么您需要确认卸载每个软件包。通过-y开关,你可以卸载它们,而不需要任何确认对话框。

您也可以通过提供-r <requirements file>选项来卸载需求文件中列出的所有包。该命令将提示对每个包的确认请求,但您可以使用-y开关抑制它:

(venv) C:\> python -m pip uninstall -r requirements.txt -y
(venv) $ python3 -m pip uninstall -r requirements.txt -y

请记住,始终检查要卸载的软件包的依赖关系。您可能希望卸载所有依赖项,但是卸载其他人使用的包会破坏您的工作环境。因此,您的项目可能不再正常工作。

如果您在虚拟环境中工作,只需创建一个新的虚拟环境就可以减少工作量。然后,您可以安装您需要的软件包,而不是尝试卸载您不需要的软件包。然而,当您需要从您的系统 Python 安装中卸载一个包时,pip uninstall会非常有用。如果您不小心在系统范围内安装了一个软件包,使用pip uninstall是清理系统的好方法。

Remove ads

探索pip的替代品

Python 社区提供了优秀的工具和库供您在pip之外使用。这些包括试图简化和改进包管理的pip的替代方案。

以下是 Python 可用的一些其他包管理工具:

工具 描述
康达 Conda 是许多语言的包、依赖和环境管理器,包括 Python。它来自 Anaconda ,最初是 Python 的一个数据科学包。因此,它被广泛用于数据科学和机器学习应用。Conda 运行自己的索引来托管兼容的包。
诗歌 如果你来自 JavaScriptnpm 那么诗歌对你来说会非常熟悉。poem 超越了包管理,帮助您为您的应用程序和库构建发行版,并将它们部署到 PyPI。
Pipenv Pipenv 是另一个软件包管理工具,它将虚拟环境和包管理合并在一个工具中。 Pipenv:新 Python 打包工具指南是开始学习 Pipenv 及其包管理方法的好地方。

只有pip捆绑在标准 Python 安装中。如果您想使用上面列出的任何替代方法,那么您必须遵循文档中的安装指南。有了这么多的选项,您一定会找到适合您编程之旅的工具!

结论

许多 Python 项目使用pip包管理器来管理它们的依赖关系。它包含在 Python 安装程序中,是 Python 中依赖性管理的基本工具。

在本教程中,您学习了如何:

  • 在您的工作环境中设置并运行pip
  • 修复与使用pip相关的常见错误
  • pip安装和卸载软件包
  • 为您的项目和应用定义需求
  • 需求文件中的引脚依赖关系

此外,您还了解了保持依赖关系最新的重要性,以及可以帮助您管理这些依赖关系的pip的替代方案。

通过仔细查看pip,您已经探索了 Python 开发工作流中的一个基本工具。使用pip,你可以安装和管理你在 PyPI 上找到的任何额外的包。您可以使用其他开发人员的外部包作为需求,并专注于使您的项目独一无二的代码。

立即观看**本教程有真实 Python 团队创建的相关视频课程。和文字教程一起看,加深理解:Pip 入门*********************************************************************************