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”选项不会影响引导过程。
修改包发布方式
提议增加一个名为“pypublish”的新的 Python 包,它将是一个发布包到 PyPI 的工具。它将取代当前的“python setup.py register”和“python setup.py upload”distutils 命令。同样,由于 Python 的发布周期和现有 Python 安装的广泛性,这些命令难以修复 bug 和扩展。此外,希望“register”和“upload”命令能够通过 HTTPS 进行,并进行证书验证。由于将 CA 证书密钥链与 Python 一起分发实际上是不可行的(更新密钥链很难管理),因此希望这些命令以及附带的密钥链能够独立于 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