PEP 486 – 使 Python 启动器能够识别虚拟环境
- 作者:
- Paul Moore <p.f.moore at gmail.com>
- 状态:
- 最终
- 类型:
- 标准跟踪
- 创建:
- 2015年2月12日
- Python 版本:
- 3.5
- 历史记录:
- 2015年2月12日
- 决议:
- Python-Dev 消息
摘要
Python 的 Windows 安装程序包含一个启动器,用于定位要运行的正确 Python 解释器(参见 PEP 397)。但是,启动器无法识别虚拟环境(virtualenv [1] 或基于 PEP 405 的环境),因此无法用于从活动虚拟环境运行命令。
本 PEP 提出使启动器“能够识别虚拟环境”。这意味着,当运行时未指定要使用的显式 Python 解释器,启动器将首先使用当前活动的虚拟环境(如果有),然后才会回退到配置的默认 Python。
基本原理
安装了多个 Python 副本的 Windows 用户需要一种选择要使用哪个副本的方法。Python 启动器通过 py
命令提供了此功能,该命令可用于运行配置的“默认” Python 或特定解释器,方法是使用命令行参数。因此,典型用法如下:
# Run the Python interactive interpreter
py
# Execute an installed module
py -m pip install pytest
py -m pytest
在使用虚拟环境时,py
启动器不知道虚拟环境处于活动状态,并将继续使用系统 Python。因此,需要不同的命令调用才能在虚拟环境中运行相同的命令
# Run the Python interactive interpreter
python
# Execute an installed module (these could use python -m,
# which is longer to type but is a little more similar to the
# launcher approach)
pip install pytest
py.test
必须使用不同的命令容易出错,并且在许多情况下,错误很难立即发现。本 PEP 提出使 py
命令能够与虚拟环境一起使用,以便在所有情况下都可以使用第一种命令形式。
实现
无论 virtualenv
还是核心 venv
模块在激活虚拟环境时都会设置环境变量 VIRTUAL_ENV
。本 PEP 提出,启动器在每次运行系统的“默认” Python 解释器(即,当未使用诸如 py -2.7
之类的特定版本标志时)时检查 VIRTUAL_ENV
环境变量,如果存在,则运行虚拟环境的 Python 解释器,而不是默认的系统 Python。
上面提到的“默认” Python 解释器(根据 PEP 397)要么是系统上安装的最新版本的 Python,要么是通过 py.ini
配置文件配置的版本。当用户在命令行上指定显式 Python 版本时,始终将使用此版本(与目前一样)。
对脚本启动的影响
除了交互式使用外,启动器还用作 Python 脚本的 Windows 文件关联。在这种情况下,脚本开头处的“shebang”(#!
)行用于识别要运行的解释器。可以使用完全限定路径,或使用特定版本的 Python(python3
或 python2
,甚至 python3.5
),或使用通用 python
,这意味着使用默认解释器。
启动器还查找特定的 shebang 行 #!/usr/bin/env python
。在 Unix 上,env
程序在 $PATH
上搜索命令并运行找到的命令。类似地,使用此 shebang 行,启动器将在用户的当前 %PATH%
上查找 python.exe
的副本,并将运行该副本。
由于激活虚拟环境意味着它被添加到 PATH
中,因此无需进行特殊处理即可使用活动虚拟环境运行脚本 - 它们只需要使用 #!/usr/bin/env python
shebang 行,就像在 Unix 上一样。(如果没有激活的虚拟环境,并且 PATH
上没有 python.exe
,启动器将查找默认 Python,就像 shebang 行是 #!python
一样)。
排除项
本 PEP 并未尝试推广在 Windows 上使用启动器运行 Python。大多数现有文档假设用户使用 python
作为运行 Python 的命令,并且(例如)使用 pip
运行已安装的 Python 命令。预计这些文档不会更改,并且选择管理其 PATH
环境变量的用户可以继续使用此形式。本 PEP 的重点纯粹是允许那些在处理其系统 Python 安装时更喜欢使用启动器的用户,能够在使用虚拟环境时继续这样做。
参考实现
实现提议行为的补丁可在 http://bugs.python.org/issue23465 获取
参考文献
版权
本文档已进入公有领域。
来源:https://github.com/python/peps/blob/main/peps/pep-0486.rst
上次修改时间:2023-09-09 17:39:29 GMT