pip:带你认识一个 Python 开发工作流程中的重要工具
本文分享自华为云社区《使用Python的pip管理项目的依赖关系》,作者:Yuchuan。
Python 的标准包管理器是 pip. 它允许您安装和管理不属于 Python 标准库的包。如果您正在寻找介绍 pip,那么您来对地方了!
在本教程中,您将学习如何:
pip 在您的工作环境中设置
修复与使用相关的常见错误 pip
安装和卸载软件包 pip
使用需求文件管理项目的依赖关系
开始使用 pip
那么,具体是 pip 做什么的呢?pip 是 Python 的包管理器。这意味着它是一个允许您安装和管理不作为标准库的一部分分发的库和依赖项的工具。pip 这个名字是由 IanBicking 在 2008 年提出的:
我已将 pyinstall 重命名为新名称:pip。名称 pip 是[an]首字母缩写词和声明:pip 安装包。(来源)
包管理非常重要,以至于 Python 的安装程序 pip 从 3.4 和 2.7.9 版本开始就分别针对 Python3 和 Python2 进行了安装。许多 Python 项目使用 pip,这使其成为每个 Pythonista 的必备工具。
如果您来自另一种编程语言,那么您可能对包管理器的概念很熟悉。JavaScript 使用 npm 进行包管理,Ruby 使用 gem,.NET 平台使用 NuGet。在 Python 中,pip 已经成为标准的包管理器。
pip 在您的系统上查找
Python3 安装程序为您在 pip 系统上安装 Python 时提供了安装选项。事实上,pip 使用 Python 安装的选项是默认勾选的,所以 pip 安装 Python 后应该就可以使用了。
注意:在某些 Linux(Unix)系统(如 Ubuntu)上,有 pip 一个名为.解释器默认不安装它。python3-pipsudoaptinstallpython3-pip
pip 您可以通过在系统上查找 pip3 可执行文件来验证它是否可用。在下面选择您的操作系统并相应地使用您的平台特定命令:
视窗
Linux+macOS
Windows 上的 where 命令会告诉你在哪里可以找到 pip3.如果 Windows 找不到名为的可执行文件 pip3,那么您也可以尝试在末尾 pip 不带三个()的情况下查找。3
在 Windows 和 Unix 系统上,pip3 可能会在多个位置找到。当您安装了多个 Python 版本时,可能会发生这种情况。如果您在系统上的任何位置都找不到 pip,那么您可以考虑重新安装 pip。
除了 pip 直接运行系统,您还可以将其作为 Python 模块运行。在下一节中,您将了解如何操作。
pip 作为模块运行
当您 pip 直接运行您的系统时,该命令本身不会显示 pip 属于哪个 Python 版本。不幸的是,这意味着您可以 pip 在不注意的情况下将包安装到旧 Python 版本的站点包中。为了防止这种情况发生,您可以 pip 作为 Python 模块运行:
请注意,您使用 python3-m 运行 pip.该-m 开关告诉 Python 将模块作为 python3 解释器的可执行文件运行。这样,您可以确保您的系统默认 Python3 版本运行该 pip 命令。如果您想了解更多关于这种跑步方式的信息 pip,那么您可以阅读 BrettCannon 关于使用 python3-mpip。
有时您可能希望更加明确并将包限制为特定项目。在这种情况下,您应该 pip 在虚拟环境中运行。
pip 在 Python 虚拟环境中使用
为避免将包直接安装到系统 Python 安装中,您可以使用虚拟环境。虚拟环境为您的项目提供了一个独立的 Python 解释器。您在此环境中使用的任何包都将独立于您的系统解释器。这意味着您可以将项目的依赖项与其他项目和整个系统分开。
pip 在虚拟环境中使用具有三个主要优点。你可以:
确保您为手头的项目使用正确的 Python 版本
确信您在运行时引用了正确的 pip 实例 pip 或 pip3
在不影响其他项目的情况下为您的项目使用特定的包版本
venvPython3 具有用于创建虚拟环境的内置模块。此模块可帮助您使用隔离的 Python 安装创建虚拟环境。激活虚拟环境后,您可以将软件包安装到此环境中。您安装到一个虚拟环境中的软件包与系统上的所有其他环境隔离。
您可以按照以下步骤创建虚拟环境并验证您是否 pip 在新创建的环境中使用该模块:
视窗
Linux+macOS
venv 在这里,您使用 Python 的内置 venv 模块创建一个虚拟环境。然后你用 source 命令激活它。()您的姓名周围的括号()venv 表示您已成功激活虚拟环境。
最后,检查激活的虚拟环境中的 pip3 和可执行文件的版本。pip 两者都指向同一个 pip 模块,因此一旦您的虚拟环境被激活,您就可以使用 pip 或 pip3。
pip 发生错误时重新安装
运行 pip 命令时,在某些情况下可能会出现错误。您的具体错误消息将取决于您的操作系统:
类似这样的错误消息表明安装 pip.
注意:pip 当命令不起作用时,在开始任何故障排除之前,您可以尝试使用末尾 pip3 带有三个()的命令。3
出现上面显示的错误可能会令人沮丧,因为 pip 对于安装和管理外部软件包至关重要。一些常见问题与 pip 此工具在您的系统上的安装方式有关。
尽管不同系统的错误消息不同,但它们都指向同一个问题:您的系统在变量 pip 中列出的位置中找不到。PATH 在 Windows 上,PATH 是系统变量的一部分。在 macOS 和 Linux 上,PATH 是环境变量的一部分。您可以 PATH 使用以下命令检查变量的内容:
视窗
Linux+macOS
此命令的输出将显示磁盘上操作系统查找可执行程序的位置(目录)列表。根据您的系统,位置可以用冒号(:)或分号(;)分隔。
默认情况下,安装 Python 或创建虚拟环境后,包含 pip 可执行文件的目录应该存在。PATH 然而,失踪 pip 是一个普遍的问题。两种受支持的方法可以帮助您 pip 再次安装并将其添加到您的 PATH:
ensurepip 模块_
get-pip.py 脚本_
自 Python3.4 以来,该 ensurepip 模块一直是标准库的一部分。添加它是为了为您提供一种直接的重新安装方式,pip 例如,如果您在安装 Python 时跳过它或 pip 在某个时候卸载了它。在下面选择您的操作系统并 ensurepip 相应地运行:
视窗
Linux+macOS
如果 pip 尚未安装,则此命令会将其安装在您当前的 Python 环境中。如果您处于活动的虚拟环境中,则该命令会安装 pip 到该环境中。否则,它将 pip 全局安装在您的系统上。该--upgrade 选项确保 pip 版本与中声明的版本相同 ensurepip。
注意:模块 ensurepip 不上网。可以安装的最新版本 pip 是 ensurepip 捆绑在您环境的 Python 安装中的版本。例如,ensurepip 使用 Python3.10.0 运行会安装 pip21.2.3。如果你想要一个更新的 pip 版本,那么你需要先运行 ensurepip.之后,您可以 pip 手动更新到其最新版本。
修复 pip 安装的另一种方法是使用 get-pip.py 脚本。该 get-pip.py 文件包含 pip 编码 ZIP 文件的完整副本。您可以 get-pip.py 直接从 PyPA 引导页面下载。一旦你的机器上有脚本,你就可以像这样运行 Python 脚本:
视窗
Linux+macOS
此脚本将在您当前的 Python 环境中安装最新版本的 pip、setuptools 和。wheel 如果您只想安装 pip,那么您可以将--no-setuptools 和--no-wheel 选项添加到您的命令中。
如果上述方法都不起作用,那么可能值得尝试为您当前平台下载最新的 Python 版本。您可以遵循 Python3 安装和设置指南,以确保 pip 已正确安装并且可以正常工作。
安装软件包 pip
Python 被认为是一种包含电池的语言。这意味着 Python 标准库包含一组广泛的包和模块,以帮助开发人员完成他们的编码项目。
同时,Python 拥有一个活跃的社区,该社区提供了更广泛的包集,可以帮助您满足开发需求。这些包发布到 Python 包索引,也称为 PyPI(发音为 PiePeaEye)。
PyPI 托管大量包,包括开发框架、工具和库。其中许多包为 Python 标准库的功能提供了友好的接口。
使用 Python 包索引(PyPI)
PyPI 托管的众多软件包之一称为 requests.该库通过抽象 HTTP 请求的复杂性 requests 来帮助您与 Web 服务进行交互。您可以在其官方文档网站上了解所有相关信息。requests
当你想 requests 在你的项目中使用这个包时,你必须首先将它安装到你的环境中。如果你不想在你的系统 Python 站点包中安装它,那么你可以先创建一个虚拟环境,如上图所示。
创建并激活虚拟环境后,命令行提示符会在括号内显示虚拟环境的名称。您从现在开始执行的任何 pip 命令都将在您的虚拟环境中发生。
要安装软件包,请 pip 提供一个 install 命令。您可以运行它来安装 requests 软件包:
视窗
Linux+macOS
在此示例中,您 pip 使用 install 命令运行,后跟要安装的包的名称。该 pip 命令在 PyPI 中查找包,解析其依赖项,并在当前 Python 环境中安装所有内容以确保其 requests 正常工作。
该 pipinstall<package>命令始终查找最新版本的软件包并安装它。它还搜索包元数据中列出的依赖项并安装它们以确保包具有所需的所有要求。
也可以在一个命令中安装多个包:
视窗
Linux+macOS
通过链接包 rptree 并 codetiming 在 pipinstall 命令中,您可以一次安装两个包。您可以在 pipinstall 命令中添加任意数量的包。在这种情况下,requirements.txt 文件可以派上用场。在本教程的后面部分,您将学习如何使用一个 requirements.txt 文件一次安装多个包。
注意:除非包的特定版本号与本教程相关,否则您会注意到版本字符串采用 x.y.z.这是一种占位符格式,可以代表 3.1.4、2.9 或任何其他版本号。当您继续操作时,终端中的输出将显示您的实际包版本号。
您可以使用该 list 命令显示安装在您的环境中的软件包及其版本号:
视窗
Linux+macOS
该 piplist 命令呈现一个表格,显示当前环境中所有已安装的包。上面的输出使用 x.y.z 占位符格式显示包的版本。在您的环境中运行该 piplist 命令时,pip 会显示您为每个包安装的特定版本号。
要获取有关特定包的更多信息,您可以使用以下 show 命令查看包的元数据 pip:
视窗
Linux+macOS
您系统上此命令的输出将列出包的元数据。该 Requires 行列出了包,例如 certifi、idna、charset-normalizer 和 urllib3。这些是安装的,因为 requests 依赖于它们才能正常工作。
现在您已经安装 requests 了它及其依赖项,您可以像导入 Python 代码中的任何其他常规包一样导入它。启动交互式 Python 解释器并导入 requests 包:
启动交互式 Python 解释器后,您导入了 requests 模块。通过调用 requests.__version__,您确认您正在 requests 虚拟环境中使用该模块。
使用自定义包索引
默认情况下,pip 使用 PyPI 查找包。但 pip 也为您提供了定义自定义包索引的选项。
pip 当 PyPI 域在您的网络上被阻止或您想要使用不公开可用的包时,使用自定义索引会很有帮助。有时系统管理员也会创建自己的内部包索引,以更好地控制 pip 公司网络上的用户可以使用哪些包版本。
自定义包索引必须符合 PEP503–SimpleRepositoryAPItoworkwithpip.您可以通过访问 PyPI 简单索引来了解此类 API(应用程序编程接口)的外观——但请注意,这是一个包含许多难以解析的内容的大页面。任何遵循相同 API 的自定义索引都可以作为该选项的目标。除了键入,您还可以使用速记。--index-url--index-url-i
例如,要从 TestPyPIrptree 包索引安装该工具,您可以运行以下命令:
视窗
Linux+macOS
使用该-i 选项,您告诉 pip 查看不同的包索引而不是默认的 PyPI。在这里,您是 rptree 从 TestPyPI 而不是从 PyPI 安装的。您可以使用 TestPyPI 来微调 Python 包的发布过程,而不会弄乱 PyPI 上的生产包索引。
如果您需要永久使用替代索引,则可以在配置文件 index-url 中设置该选项。该文件名为,您可以通过运行以下命令找到它的位置:pippip.conf
视窗
Linux+macOS
使用该 pipconfiglist 命令,您可以列出活动配置。此命令仅在您设置了自定义配置时才会输出。否则,输出为空。那时,additive--verbose 或-vv,选项可能会有所帮助。添加时-vv,pip 会显示它在哪里查找不同的配置级别。
如果要添加 pip.conf 文件,则可以选择 pipconfiglist-vv 列出的位置之一。具有自定义包索引的 pip.conf 文件如下所示:
当你有这样的 pip.conf 文件时,pip 将使用定义 index-url 的来查找包。使用此配置,您无需--index-url 在命令中使用选项 pipinstall 来指定您只需要可以在 TestPyPI 的简单 API 中找到的包。
从 GitHub 存储库安装包
您不仅限于托管在 PyPI 或其他包索引上的包。pip 还提供了从 GitHub 存储库安装包的选项。但即使包托管在 PyPI 上,例如 RealPython 目录树生成器,您也可以选择从其 Git 存储库安装它:
视窗
Linux+macOS
使用该 git+https 方案,您可以指向包含可安装包的 Git 存储库。您可以通过运行交互式 Python 解释器并导入来验证您是否正确安装了包 rptree:
启动交互式 Python 解释器后,导入 rptree 模块。通过调用 rptree.__version__,您可以验证您正在使用 rptree 基于虚拟环境的模块。
注意:如果您使用的是 Git 以外的版本控制系统(VCS),pip 您是否了解过。要了解如何使用 pipMercurial、Subversion 或 Bazaar,请查看文档的 VCS 支持章节 pip。
如果包不是托管在 PyPI 上但具有远程 Git 存储库,则从 Git 存储库安装包会很有帮助。您指向的远程存储库 pip 甚至可以托管在公司 Intranet 上的内部 Git 服务器上。当您在防火墙后面或对 Python 项目有其他限制时,这可能很有用。
以可编辑模式安装包以简化开发
在处理自己的包时,以可编辑模式安装它是有意义的。通过这样做,您可以像在任何其他包中一样使用命令行,同时处理源代码。一个典型的工作流程是首先克隆存储库,然后 pip 将其作为可编辑包安装到您的环境中:
视窗
Linux+macOS
使用上面的命令,您将 rptree 包安装为可编辑模块。以下是您刚刚执行的操作的分步细分:
第 1 行克隆了 rptree 包的 Git 存储库。
第 2 行将工作目录更改为 rptree/.
第 3 行和第 4 行创建并激活了一个虚拟环境。
第 5 行将当前目录的内容安装为可编辑的包。
-e 选项是选项的简写--editable。当您使用带有的-e 选项时 pipinstall,您告诉 pip 您要以可编辑模式安装包。不使用包名,而是使用点(.)来指向 pip 当前目录。
如果您没有使用该-e 标志,pip 则通常会将软件包安装到您的环境 site-packages/文件夹中。当您以可编辑模式安装包时,您将在站点包中创建指向本地项目路径的链接:
使用 pipinstall 带有标志的命令-e 只是 pipinstall 提供的众多选项之一。您可以查看文档中的 pipinstall 示例。pip 在那里,您将学习如何安装特定版本的包或指向 pip 不是 PyPI 的不同索引。
在下一部分中,您将了解需求文件如何帮助您的 pip 工作流程。
使用需求文件
该 pipinstall 命令始终安装包的最新发布版本,但有时您的代码需要特定的包版本才能正常工作。
您希望创建用于开发和测试应用程序的依赖项和版本的规范,以便在生产中使用该应用程序时不会感到意外。
固定要求
当您与其他开发人员共享您的 Python 项目时,您可能希望他们使用与您正在使用的相同版本的外部包。可能某个包的特定版本包含您依赖的新功能,或者您正在使用的包的版本与以前的版本不兼容。
这些外部依赖项也称为需求。您经常会发现 Python 项目将其需求固定在一个名为 requirements.txt 或类似的文件中。需求文件格式允许您精确指定应该安装哪些包和版本。
运行 piphelp 显示有一个 freeze 命令以需求格式输出已安装的包。您可以使用此命令,将输出重定向到文件以生成需求文件:
视窗
Linux+macOS
requirements.txt 此命令在您的工作目录中创建一个文件,其内容如下:
请记住,x.y.z 上面显示的是包版本的占位符格式。您的 requirements.txt 文件将包含真实的版本号。
该 freeze 命令将当前安装的包的名称和版本转储到标准输出。您可以将输出重定向到一个文件,您以后可以使用该文件将您的确切要求安装到另一个系统中。您可以随意命名需求文件。然而,一个被广泛采用的约定是命名它 requirements.txt。
当您想在另一个系统中复制环境时,您可以运行 pipinstall,使用-r 开关指定需求文件:
视窗
Linux+macOS
在上面的命令中,您告诉 pip 将列出的软件包安装 requirements.txt 到当前环境中。包版本将匹配 requirements.txt 文件包含的版本约束。您可以运行 piplist 以显示刚刚安装的软件包及其版本号:
视窗
Linux+macOS
现在您已准备好分享您的项目!您可以提交 requirements.txt 到 Git 等版本控制系统,并使用它在其他机器上复制相同的环境。但是等等,如果为这些软件包发布了新的更新会发生什么?
微调要求
对包的版本和依赖项进行硬编码的问题在于,包会经常使用错误和安全修复进行更新。您可能希望在这些更新发布后立即利用它们。
需求文件格式允许您使用比较运算符指定依赖版本,这使您可以灵活地确保更新包,同时仍定义包的基本版本。
requirements.txt 在您喜欢的编辑器中打开并将相等运算符(==)转换为大于或等于运算符(>=),如下例所示:
您可以将比较运算符更改>=为告诉 pip 安装已发布的确切或更高版本。当您使用该 requirements.txt 文件设置新环境时,pip 查找满足要求的最新版本并安装它。
接下来,您可以通过使用开关或简写运行 install 命令来升级需求文件中的软件包:--upgrade-U
视窗
Linux+macOS
如果列出的软件包有新版本可用,则该软件包将被升级。
在理想情况下,新版本的包将向后兼容并且永远不会引入新的错误。不幸的是,新版本可能会引入会破坏您的应用程序的更改。为了微调您的需求,需求文件语法支持额外的版本说明符。
想象一下,发布了一个新版本,3.0 但 requests 引入了一个不兼容的更改,从而破坏了您的应用程序。您可以修改需求文件以防止 3.0 或更高版本被安装:
更改包的版本说明符可确保不会安装 requests 任何大于或等于的版本。3.0 该 pip 文档提供了有关需求文件格式的大量信息,您可以查阅它以了解更多信息。
分离生产和开发依赖
并非您在应用程序开发过程中安装的所有软件包都是生产依赖项。例如,您可能想要测试您的应用程序,因此您需要一个测试框架。一个流行的测试框架是 pytest.您想将它安装在您的开发环境中,但您不希望它在您的生产环境中,因为它不是生产依赖项。
您创建第二个需求文件,requirements_dev.txt 以列出用于设置开发环境的其他工具:
拥有两个需求文件将要求您使用 pip 它们来安装它们,requirements.txt 并且 requirements_dev.txt.幸运的是,pip 允许您在需求文件中指定其他参数,因此您可以修改 requirements_dev.txt 以安装生产 requirements.txt 文件中的需求:
请注意,您使用相同的-r 开关来安装生产 requirements.txt 文件。现在,在您的开发环境中,您只需运行这个命令即可安装所有要求:
视窗
Linux+macOS
因为 requirements_dev.txt 包含该-rrequirements.txt 行,所以您不仅要安装,还要 pytest 安装 requirements.txt.在生产环境中,仅安装生产要求就足够了:
视窗
Linux+macOS
使用此命令,您可以安装 requirements.txt.与您的开发环境相比,您的生产环境不会 pytest 安装。
生产冷冻要求
您创建了生产和开发需求文件并将它们添加到源代码控制中。这些文件使用灵活的版本说明符来确保您利用依赖项发布的错误修复。您还测试了您的应用程序,现在可以将其部署到生产环境中。
您知道所有测试都通过并且应用程序与您在开发过程中使用的依赖项一起工作,因此您可能希望确保将相同版本的依赖项部署到生产环境。
当前版本说明符不保证相同的版本将部署到生产中,因此您希望在发布项目之前冻结生产需求。
根据当前需求完成开发后,创建当前项目新版本的工作流程如下所示:
通过这样的工作流程,该 requirements_lock.txt 文件将包含准确的版本说明符,并可用于复制您的环境。您已确保当您的用户将列出的软件包安装 requirements_lock.txt 到他们自己的环境中时,他们将使用您希望他们使用的版本。
冻结您的需求是确保您的 Python 项目在用户环境中以与在您的环境中相同的方式工作的重要步骤。
卸载软件包 pip
有时,您必须卸载一个软件包。要么你找到了一个更好的库来替换它,要么它是你不需要的东西。卸载软件包可能有点棘手。
请注意,当您安装时 requests,您还 pip 必须安装其他依赖项。您安装的包越多,多个包依赖相同依赖项的机会就越大。这就是 show 命令 inpip 派上用场的地方。
在卸载软件包之前,请确保运行该 show 软件包的命令:
视窗
Linux+macOS
注意最后两个字段 Requires 和 Required-by。该 show 命令告诉您 requests 需要 certifi、idna、charset-normalizer 和 urllib3。您可能也想卸载这些。请注意,requests 任何其他软件包都不需要。所以卸载它是安全的。
您应该 show 针对所有依赖项运行该命令,requests 以确保没有其他库也依赖于它们。一旦了解了要卸载的软件包的依赖顺序,就可以使用以下 uninstall 命令删除它们:
视窗
Linux+macOS
该 uninstall 命令向您显示将被删除的文件并要求确认。如果您确定要删除包,因为您已经检查了它的依赖关系并且知道没有其他东西在使用它,那么您可以传递一个-y 开关来禁止文件列表和确认对话框:
视窗
Linux+macOS
在这里你卸载 urllib3。使用该-y 开关,您可以抑制询问您是否要卸载此软件包的确认对话框。
在一次调用中,您可以指定要卸载的所有包:
视窗
Linux+macOS
您可以将多个包传递给 pipuninstall 命令。如果您没有添加任何额外的开关,那么您需要确认卸载每个包。通过传递-y 开关,您可以在没有任何确认对话框的情况下将它们全部卸载。
您还可以通过提供-r<requirementsfile>选项来卸载需求文件中列出的所有包。此命令将提示每个包的确认请求,但您可以使用-y 开关抑制它:
视窗
Linux+macOS
请记住始终检查要卸载的软件包的依赖关系。您可能想卸载所有依赖项,但卸载其他人使用的包会破坏您的工作环境。因此,您的项目可能不再正常工作。
如果您在虚拟环境中工作,只需创建一个新的虚拟环境就可以减少工作量。然后您可以安装您需要的软件包,而不是尝试卸载您不需要的软件包。但是,pipuninstall 当您需要从系统 Python 安装中卸载包时,它会非常有用。pipuninstall 如果您不小心在系统范围内安装了软件包,使用是一种整理系统的好方法。
探索替代方案 pip
Python 社区提供了出色的工具和库供您在 pip.pip 这些包括尝试简化和改进包管理的替代方案。
以下是可用于 Python 的其他一些包管理工具:
仅 pip 捆绑在标准 Python 安装中。如果您想使用上面列出的任何替代方案,则必须遵循其文档中的安装指南。有这么多选择,您一定会找到适合您的编程之旅的工具!
结论
许多 Python 项目使用 pip 包管理器来管理它们的依赖项。它包含在 Python 安装程序中,是 Python 中依赖项管理的重要工具。
在本教程中,您学习了如何:
pip 在您的工作环境中设置和运行
修复与使用相关的常见错误 pip
安装和卸载软件包 pip
定义项目和应用程序的要求
在需求文件中固定依赖项
此外,您还了解了使依赖项保持最新的重要性以及 pip 可以帮助您管理这些依赖项的替代方法。
通过仔细查看 pip,您已经探索了 Python 开发工作流程中的一个重要工具。使用,您可以安装和管理在 PyPIpip 上找到的任何其他包。您可以使用来自其他开发人员的外部包作为需求,并专注于使您的项目独一无二的代码。
版权声明: 本文为 InfoQ 作者【华为云开发者社区】的原创文章。
原文链接:【http://xie.infoq.cn/article/08e3e0cf952defe35dd4345cc】。文章转载请联系作者。
评论