PEP 704 – 包安装程序默认要求使用虚拟环境
- 作者:
- Pradyun Gedam <pradyunsg at gmail.com>
- 赞助人:
- Brett Cannon <brett at python.org>
- PEP委托人:
- Paul Moore <p.f.moore at gmail.com>
- 讨论邮件列表:
- Discourse 帖子
- 状态:
- 已撤回
- 类型:
- 标准跟踪
- 主题:
- 打包
- 创建日期:
- 2023年1月16日
- 修订历史:
- 2023年1月16日
摘要
本PEP建议像pip
这样的包安装程序在Python 3.13及更高版本上默认要求使用虚拟环境。
PEP撤回
在讨论本PEP期间,很明显pip的用户体验更改不受PEP提议的控制。同时也很清楚,大量用户依赖于能够将pip管理的依赖项与其他工具管理的依赖项混合使用(最主要的是使用Conda时)。
此外,提议更改的许多好处可以通过PEP 668(在撰写本文时已被接受并实现)来实现。它为Python解释器的重新分发者提供了控制权,以决定是否要求用户使用虚拟环境,向用户显示的消息以及如何为其用户推出此更改。
由于使用pip
强制执行虚拟环境是本PEP的主要重点,因此撤回本PEP比将其重新聚焦于其他主题更合适。
将来仍然可以创建一个PEP来解决虚拟环境命名约定问题,但最好将任何此类工作作为一个新的PEP开始,该PEP侧重于此类约定的好处,而不是强制执行。
动机
Python虚拟环境是Python开发工作流程中必不可少的一部分。但是,它们需要额外的努力,因为它们是可选功能,并且要求用户:
- 采取明确的步骤激活/停用虚拟环境
- 使用
<path-to-venv>/<bin-path>/<executable>
运行文件
对于新用户来说,当不使用虚拟环境时,事情似乎会正常工作——直到它们不正常工作为止。此外,在不同平台上激活虚拟环境使用略微不同的语法和机制。这使得虚拟环境的介绍变得复杂,因为现在需要向用户解释有关它们如何/为何有用的信息和上下文,以证明在工作流程中添加额外步骤是合理的。
它也为错误创造了空间,因为用户需要记住在运行像pip
这样的安装程序之前激活虚拟环境或配置这些安装程序以出错。在某些Linux发行版上,忘记这样做会导致安装程序修改操作系统拥有的文件(这部分由PEP 668缓解,适用于选择相应标记其环境的发行版)。
基本原理
更改像pip
这样的安装程序的默认行为以要求激活虚拟环境将:
- 使新用户更容易开始使用Python(因为存在一致的体验,并且虚拟环境被理解为必须使用的东西)
- 默认情况下减少所有用户意外安装问题的范围(通过明确标记何时未使用虚拟环境)。
建立将虚拟环境放置在树内名为.venv
的目录中的约定,消除了常见工作流程的决策点,并在生态系统中创建了一个清晰的约定。
规范
默认要求使用虚拟环境
当用户在没有活动虚拟环境的情况下运行安装程序时,安装程序应打印错误消息并以非零退出代码退出。
错误消息应告知用户需要虚拟环境,应提供特定于shell的说明,说明如何创建和激活名为.venv
的虚拟环境,并且应提供指向解释如何创建和激活虚拟环境的文档页面的链接。
有关更多详细信息,请参阅实现说明。
禁用虚拟环境
安装程序还应提供一个明确的选项来禁用此要求,允许最终用户在虚拟环境外部使用它。如果安装程序不提供此功能,则应在错误消息和文档页面中提及这一点。
更改的一致时间线
安装程序可以在任何Python版本上选择实现此默认行为,但应在Python 3.13或更高版本上实现。
向后兼容性
此PEP与用户在虚拟环境外部使用安装程序的工作流程不兼容。此类用户将收到错误消息提示,并且需要:
- 明确选择在虚拟环境外部运行安装程序,或
- 创建并使用虚拟环境
已经使用虚拟环境的用户不会受到此更改的影响。
工作流程工具(在后台为用户管理虚拟环境)应该不受影响,因为它们应该已经在使用虚拟环境来运行安装程序。
安全影响
此PEP没有引入任何新的安全影响。
如何教授
此PEP要求新用户创建并使用虚拟环境来开始使用Python包。但是,这是一种最佳实践,正如Python打包用户指南中“如何安装Python包的基础知识”部分所演示的那样,该部分在讨论使用pip
之前解释了虚拟环境是什么以及如何使用。
参考实现
此PEP没有参考实现。但是,提议的行为在很大程度上已在pip
中实现,可以通过将PIP_REQUIRE_VENV
环境变量设置为1
来激活。(将其保留为空会导致提议的可选行为,即在安装时不需要虚拟环境。)
实现说明
检测活动虚拟环境
如PEP 668中所述,稳健检测虚拟环境的逻辑类似于
def is_virtual_environment():
return sys.base_prefix != sys.prefix or hasattr(sys, "real_prefix")
关于使用虚拟环境的文档
包安装程序应在错误消息中提供指向文档页面的链接。
理想情况下,此类文档页面将解释虚拟环境是什么,为什么需要它们以及如何使用venv
创建和激活虚拟环境。它应包含针对最常见的shell和平台的说明。
此类文档页面应在Python打包用户指南中提供,以减少安装程序在涵盖此主题方面的重复工作。
被拒绝的想法
不要为虚拟环境目录指定名称
出于以下几个原因,为虚拟环境目录使用一致的名称非常重要:
- 它使用户更容易找到虚拟环境目录并激活它。
- 它消除了新用户的决策点,因为他们不需要决定虚拟环境目录的名称。
- 它在生态系统中创建了一个清晰的约定,这使用户更容易找到文档。
- 它确保了不同工具之间的一致性,因此错误消息的差异不会让用户感到困惑。
使用不同的虚拟环境目录名称
在功能上,只要有一个单一的一致建议,目录名称并不重要。
选择名称.venv
是因为它:
- 不与任何有效的Python导入名称冲突
- 不与标准库中的
venv
模块冲突 - 在Python社区中已有先例
- 支持常用文本编辑器中的自动检测
- 可以在常见的键盘布局上无需修饰键即可键入
不要将工具行为与Python版本耦合
此PEP在安装程序的行为和Python版本之间创建了耦合。
这已经是安装工具中行为更改正在使用的推出机制。例如,Python 3.11上的pip
将使用importlib.metadata
而不是pkg_resources
来解析/获取包元数据,并使用sysconfig
而不是distutils.sysconfig
来获取解压缩轮子的路径。
与这些情况的不同之处在于,它们应该对最终用户来说很大程度上是透明的。本PEP提议的行为更改对最终用户来说不是透明的,并且要求他们采取行动。
其主要好处是,它允许重新分发者及时为新Python版本调整其工具,并为整个生态系统提供了一个清晰且一致的更改点。它还明确了默认行为何时将始终要求默认使用虚拟环境(一旦Python 3.12 结束生命周期)。
此方法的主要问题是,当用户升级到新Python版本时,它会对用户强制执行行为更改,这可能会阻碍新Python版本的采用。但是,对于现有用户来说,这是一个迁移/升级,并且普遍期望迁移/升级需要进行某些更改。
本PEP的作者认为,在整个生态系统中以截止日期一致地应用此方法的好处超过了在用户升级时强制执行最佳实践的缺点。
未解决的问题
无。
版权
本文档置于公共领域或根据CC0-1.0-Universal许可证,以两者中更宽松者为准。
来源:https://github.com/python/peps/blob/main/peps/pep-0704.rst
上次修改时间:2023年9月9日17:39:29 GMT