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 的方法。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
最后修改: 2025-02-01 08:59:27 GMT