PEP 439 – Python 安装中包含隐式 pip 引导程序
- 作者:
- Richard Jones <richard at python.org>
- BDFL-委托人:
- Alyssa Coghlan <ncoghlan at gmail.com>
- 讨论列表:
- Distutils-SIG 列表
- 状态:
- 已拒绝
- 类型:
- 标准跟踪
- 主题:
- 打包
- 创建日期:
- 2013年3月18日
- Python 版本:
- 3.4
- 历史记录:
- 2013年3月19日
- 决议:
- Distutils-SIG 消息
摘要
本 PEP 提案在 Python 安装中包含一个 pip 引导程序可执行文件,以简化 Python 用户使用第三方模块。
本 PEP 并不建议将 pip 实现包含在 Python 标准库中。也不建议实现任何超出 PEP 427(“Wheel 二进制包格式 1.0”)和 TODO distlib PEP 提供的包管理或安装机制。
PEP 拒绝
本 PEP 已被拒绝,取而代之的是一种更明确的机制,该机制应该能够以更可靠的方式实现相同的结果。更明确的引导机制在PEP 453中进行了描述。
基本原理
目前,安装第三方 Python 模块的用户故事并不像它可能的那样简单。它要求所有第三方模块告知用户如何安装安装程序,通常通过指向安装程序的链接。该链接可能已过时,或者执行安装程序安装所需的步骤可能足以成为障碍,阻止用户进一步操作。
强调低入门门槛的大型 Python 项目一直回避依赖于第三方包,因为这为新用户引入了潜在的障碍。
通过在标准 Python 安装中包含包安装程序命令,安装附加软件的障碍大大降低。希望这将因此增加 Python 项目重用第三方软件的可能性。
Python 社区在当前的 pip 和 setuptools 引导程序过程中也存在复杂性问题。它们都有自己的引导下载文件,用法略有不同,甚至在某些情况下相互引用。拥有一个在所有这些程序中通用的、用法简单的单一引导程序将是更好的选择。
还希望这能够减少将越来越多的软件包含在 Python 标准库中的提案数量,从而使更流行的 Python 软件更容易升级,而无需 Python 安装升级。
提案
引导程序将通过从 PyPI 下载其安装文件来安装 pip 实现和 setuptools。
此提案影响了打包的两个组件:pip 引导程序以及,由于更容易安装包,发布包的修改。
此提案的核心是使用 pip 的用户体验不应该要求用户安装 pip。
pip 引导程序
Python 安装包含一个名为“pip3”的可执行文件(有关命名原理等,请参见PEP 394),该文件尝试导入 pip 机制。如果可以,则 pip 命令照常进行。如果不行,它将通过下载 pip 实现和 setuptools wheel 文件来引导 pip。此后,“pip 实现”的安装将意味着安装 setuptools 和 virtualenv。安装完成后,pip 命令照常进行。引导过程完成后,“pip3”命令不再是引导程序,而是完整的 pip 命令。
使用引导程序代替完整的 pip 代码,这样我们就不必捆绑 pip,并且 pip 可以在常规 Python 升级时间范围和流程之外进行升级。
为了避免与 sudo 相关的问题,我们将引导程序默认为将 pip 实现安装到PEP 370中定义并在 Python 2.6/3.0 中实现的每个用户 site-packages 目录。由于我们避免安装到系统 Python,因此我们也避免与任何其他打包系统(例如 Linux 系统上的打包系统)发生冲突。如果用户位于PEP 405虚拟环境中,则 pip 实现将安装到该虚拟环境中。
引导过程将按以下步骤进行
- 用户系统已安装 Python (3.4+)。在 Python 安装的“scripts”目录中,有一个名为“pip3”的引导程序脚本。
- 用户将调用 pip 命令,通常为“pip3 install <package>”,例如“pip3 install Django”。
- 引导程序脚本将尝试导入 pip 实现。如果成功,则正常处理 pip 命令。停止。
- 如果未能导入 pip 实现,引导程序会通知用户需要“安装 pip”。它会询问用户是否应将 pip 作为系统范围的 site-packages 安装还是作为仅用户包安装。此选择也将作为 pip 的命令行选项提供,以便非交互式使用成为可能。
- 引导程序将联系 PyPI 以获取最新的下载 wheel 文件(请参见PEP 427)。
- 下载文件后,使用“python setup.py install”安装。
- pip 工具现在可以导入 pip 实现,并继续正常处理用户请求的命令。
用户可能在无法访问公共互联网的环境中运行,并且仅依赖于本地包存储库。他们将对“pip3 install”命令使用“-i”(Python 包索引的基本 URL)参数。这只是覆盖指向 PyPI 的默认索引 URL。
某些用户可能没有适合获取 pip 实现文件的互联网访问权限。这些用户可以手动下载并安装 setuptools 和 pip tar 文件。无需为这种情况添加特定的支持。
pip 实现安装文件的下载将以安全方式执行。来自 pypi.python.org 的传输将通过 HTTPS 完成,并执行 CA 证书检查。此功能将在 Python 3.4+ 中使用操作系统证书(请参见 PEP XXXX)。
除了控制索引位置和下载选项的参数外,“pip3”引导程序命令还可以支持更多标准 pip 选项以实现详细程度、静默和日志记录。
“pip3”命令将支持两个在引导过程中使用并在其他情况下忽略的新命令行选项。它们控制 pip 实现的安装位置
--bootstrap
- 安装到用户的包目录。选择此选项的名称是为了将其作为首选安装选项进行推广。
--bootstrap-to-system
- 安装到系统 site-packages 目录。
这些命令行选项也需要实现,但在其他情况下会被忽略,在 pip 实现中也是如此。
应考虑如果 pip 安装在该位置,则将 pip 默认为将包安装到用户的包目录。
“pip3”命令的“–no-install”选项不会影响引导过程。
发布包的修改
提议了一个额外的新的 Python 包“pypublish”,它将是一个用于将包发布到 PyPI 的工具。它将取代当前的“python setup.py register”和“python setup.py upload”distutils 命令。同样,由于 Python 发布周期经过衡量,并且存在大量现有的 Python 安装,因此这些命令难以修复错误和扩展。此外,希望能够通过 HTTPS 并使用证书验证来执行“register”和“upload”命令。由于随 Python 一起提供 CA 证书密钥链实际上不可行(更新密钥链非常难以管理),因此希望这些命令以及随附的密钥链能够在 Python 本身之外进行安装和升级。
现有的 distutils 包注册和上传机制将保留,但会显示弃用警告。
实现
此 PEP 所需的 pip 更改正在该项目的错误跟踪器[2]中跟踪。最值得注意的是,在 pip 命令行中添加了 –bootstrap 和 –bootstrap-to-system。
最好是 pip 和 setuptools 项目分发 wheel 格式的下载文件。
此实现所需的代码是上面描述的“pip3”命令。额外的 pypublish 可以在本 PEP 工作范围之外开发。
最后,希望“pip3”能够移植到 Python 2.6+,以便单个命令能够替换现有的 pip、setuptools 和 virtualenv(将添加到引导程序)引导程序脚本。将该引导程序包含在未来的 Python 2.7 版本中也将非常受欢迎。
风险
用于签署 pip 实现下载的密钥可能会受到损害,并且本 PEP 目前没有提出密钥吊销机制。
还有一个名为“pip”的 Perl 包安装程序。它非常罕见,并且不常用。Linux 的 Fedora 变体历史上将 Python 的“pip”命名为“python-pip”,将 Perl 的“pip”命名为“perl-pip”。此策略已更改[3],以便未来的和升级后的 Fedora 安装将使用“pip”作为 Python 的“pip”。现有的(未升级的)安装仍将使用旧名称作为 Python 的“pip”,尽管现在混淆的可能性大大降低了。
参考文献
致谢
感谢 Alyssa Coghlan 对该提案的思考以及处理 Red Hat 问题的帮助。
感谢 Jannis Leidel 和 Carl Meyer 的想法。感谢 Marcus Smith 提供的反馈。
感谢 Marcela Mašláňová 解决 Fedora 问题。
版权
本文档已置于公共领域。
来源:https://github.com/python/peps/blob/main/peps/pep-0439.rst
最后修改时间:2023年10月11日 12:05:51 GMT