Following system colour scheme - Python 增强提案 Selected dark colour scheme - Python 增强提案 Selected light colour scheme - Python 增强提案

Python 增强提案

PEP 394 – 类 Unix 系统上的“python”命令

作者:
Kerrick Staley <mail at kerrickstaley.com>、Alyssa Coghlan <ncoghlan at gmail.com>、Barry Warsaw <barry at python.org>、Petr Viktorin <encukou at gmail.com>、Miro Hrončok <miro at hroncok.cz>、Carol Willing <willingc at gmail.com>
状态:
活跃
类型:
信息性
创建日期:
2011 年 3 月 2 日
发布历史:
2011 年 3 月 4 日,2011 年 7 月 20 日,2012 年 2 月 16 日,2014 年 9 月 30 日,2018 年 4 月 28 日,2019 年 6 月 26 日
决议:
Python-Dev 消息

目录

摘要

本 PEP 概述了在调用 python 命令时 Python 脚本的行为。根据发行版或系统配置,python 可能已安装,也可能未安装。如果 python 已安装,其目标解释器可能指向 python2python3。终端用户可能不知道类 Unix 系统之间的这种不一致性。本 PEP 的目标是减少用户对 python 引用什么以及脚本行为的困惑。

本 PEP 的下一节中的建议将概述在以下情况下的行为

  • 使用虚拟环境
  • 使用 python2python3 的 shebangs 编写跨平台脚本

本 PEP 的目标是澄清脚本终端用户、发行版提供商和脚本维护者/作者的行为。

建议

我们的建议详情如下。我们指出这些建议所基于的任何期望。

面向 Python 运行时分发商

  • 我们期望类 Unix 软件发行版(包括 macOS 和 Cygwin 等系统)在安装 Python 2 解释器版本时,将 python2 命令安装到默认路径中,Python 3 解释器也同样如此,将 python3 安装到默认路径中。
  • 调用时,python2 应运行某个版本的 Python 2 解释器,python3 应运行某个版本的 Python 3 解释器。
  • 如果安装了 python 命令,它应调用与 python3 命令相同版本的 Python,或与 python2 命令相同版本的 Python。
  • 发行商可以选择按如下方式设置 python 命令的行为
    • python2,
    • python3,
    • 不提供 python 命令,允许终端用户或系统管理员配置 python
  • Python 3.x 的 idlepydocpython-config 命令也应以 idle3pydoc3python3-config 的形式提供;Python 2.x 版本则为 idle2pydoc2python2-config。不带版本号的命令应调用与 python 命令相同版本的 Python,或者根本不提供。
  • 在打包第三方 Python 脚本时,鼓励发行商将不够具体的 shebangs 更改为更具体的 shebangs。这确保了软件与最新版本的 Python 一起使用,并且可以消除对 Python 2 的依赖。至于具体设置什么,则由发行商自行决定。示例具体内容可能包括
    • 当支持 Python 3.x 时,将 python shebangs 更改为 python3
    • 当尚不支持 Python 3.x 时,将 python shebangs 更改为 python2
    • 如果软件是用 Python 3.8 构建的,则将 python3 shebangs 更改为 python3.8
  • 当虚拟环境(由 PEP 405 venv 包或类似工具(如 virtualenvconda)创建)处于活动状态时,python 命令应指向虚拟环境的解释器,并且应始终可用。python3python2 命令(根据环境的解释器版本)也应可用。

面向 Python 脚本发布者

  • 当从 Python 脚本重新调用解释器时,查询 sys.executable 以避免对解释器位置的硬编码假设仍然是首选方法。
  • 鼓励您的终端用户使用虚拟环境。这使得用户环境更具可预测性(可能会减少问题),并有助于避免干扰其系统。
  • 对于仅期望在激活的虚拟环境中运行的脚本,shebang 行可以写成 #!/usr/bin/env python,因为这指示脚本遵循活动的虚拟环境。
  • 如果脚本期望在虚拟环境之外执行,开发人员需要注意跨平台和安装方法的以下差异
    • 较旧的 Linux 发行版将提供指向 Python 2 的 python 命令,并且很可能不提供 python2 命令。
    • 一些较新的 Linux 发行版将提供指向 Python 3 的 python 命令。
    • 一些 Linux 发行版默认根本不提供 python 命令,但默认提供 python3 命令。
  • 在可能针对这些环境时,开发人员可以使用 Python 包安装工具,该工具会为已安装的环境重写 shebang 行,提供有关交互式更新 shebang 行的说明,或者使用更具体的、针对目标环境量身定制的 shebang 行。
  • 同时针对“旧系统”和没有默认 python 命令的脚本需要做出折衷并记录这种情况。避免使用 shebangs(通过 console_scripts 入口点([9])或类似方法)是解决此问题的推荐方法。
  • 专门为特定环境(例如容器或虚拟环境)设计的应用程序可以继续使用 python 命令名称。

面向 Python 终端用户

  • 尽管 python 远未普遍可用,但它仍然是显式调用 Python 的首选拼写,因为这是虚拟环境在不同平台和 Python 安装之间始终提供的一致拼写。
  • 对于未随系统分发(或为其开发)的软件,我们建议使用虚拟环境,可能结合 condapipenv 等环境管理器,以帮助避免干扰您的系统 Python 安装。

这些建议是 2011 年 3 月和 7 月([1][2])、2012 年 2 月([4])、2014 年 9 月([6])、2018 年 4 月 GitHub 讨论([7])、2019 年 2 月 python-dev 讨论([8])以及 2019 年 5 月/6 月 PEP 更新审查([10])中相关 python-dev 讨论的结果。

本 PEP 的历史

2011 年,大多数发行版将 python 命令别名为 Python 2,但有些开始将其切换到 Python 3 ([5])。由于一些前者发行版默认不提供 python2 命令,因此以前 Python 2 代码(或任何直接调用 Python 2 解释器而不是通过 sys.executable 调用它的代码)无法在所有类 Unix 系统上可靠运行而无需修改,因为 python 命令会在某些系统上调用错误的解释器版本,而 python2 命令则会在其他系统上完全失败。本 PEP 最初提供了一个非常简单的机制来恢复跨平台支持,只需发行版维护者进行最少额外工作。简而言之,建议是

  1. 对于与 Python 2 和 3 都兼容的代码,首选 python 命令(因为它在所有系统上都可用,即使那些已经将其别名为 Python 3 的系统)。
  2. python 命令应始终调用 Python 2(以防止当 Python 2 代码在 Python 3 上运行时出现难以诊断的错误)。
  3. python2python3 命令应可用以明确指定版本。

然而,这些建议隐含地假设 Python 2 将始终可用。随着 Python 2 在 2020 年接近其生命周期结束(PEP 373PEP 404),发行版正在将 Python 2 作为可选或完全删除。这意味着要么删除 python 命令,要么将其切换为调用 Python 3。一些发行商还决定,忽略 PEP 的原始建议对他们的用户更有利,并允许系统管理员根据其特定环境的需求自由配置其系统。

当前原理

截至 2019 年,在脚本执行前激活 Python 虚拟环境(或其功能等效物)是获得一致的跨平台和跨发行版体验的一种方式。

因此,发布者可以期望软件用户提供合适的执行环境。

本建议的未来变更

此建议将在未来几年内定期审查,并在核心开发团队认为适当时进行更新。作为参考,Python 2.7 系列的定期维护版本将持续到 2020 年 1 月。

迁移说明

本节不包含核心 CPython 开发人员的任何官方建议。它只是一个关于迁移到 Python 3 作为系统默认 Python 版本的各种方面的注意事项集合。希望它们对考虑进行此类更改的任何发行版有所帮助。

  • 发行版将 python 命令从 python2 切换到 python3 的主要障碍不是发行版内部的破坏,而是由系统管理员和其他用户开发的私有第三方脚本的破坏。将 python 命令默认更新为调用 python3 表明发行版愿意破坏此类脚本,并可能导致对不熟悉 Python 3 中向后不兼容更改的用户来说相当令人困惑的错误。例如,虽然将 print 从语句更改为内置函数对于自动化转换器来说相对简单,但尝试在 Python 3 中使用 Python 2 符号可能会让不了解此更改的用户感到困惑,从而导致 SyntaxError
    $ python3 -c 'print "Hello, world!"'
      File "<string>", line 1
        print "Hello, world!"
              ^
    SyntaxError: Missing parentheses in call to 'print'. Did you mean print("Hello, world!")?
    

    虽然这对于经验丰富的 Python 爱好者来说可能很明显,但此类脚本甚至可能由根本不熟悉 Python 的人运行。避免破坏此类第三方脚本是本 PEP 过去建议 python 继续指向 python2 的关键原因。

  • 错误消息 python: command not found 通常具有令人惊讶的可操作性,即使对于不熟悉 Python 的人也是如此。
  • 现代系统上存在 pythonX.X(例如 python3.6)命令,它们调用 Python 解释器的特定次要版本。如果这些实用程序存在,发行版特定的包可以利用它们,因为如果给定主要版本的默认次要版本发生更改,它将防止代码中断。但是,旨在跨平台的脚本不应依赖于这些实用程序的存在,而应在目标主要版本的几个最新次要版本上进行测试,并在必要时弥补次要版本之间存在的微小差异。这避免了系统管理员安装许多非常相似的解释器版本的需要。
  • 当发行版提供 pythonX.X 二进制文件时,python2python3 命令应指向其中一个文件,而不是作为单独的二进制文件提供。
  • 强烈建议发行版特定的包使用 python3(或 python2),而不是 python,即使是在不打算在其他发行版上运行的代码中也是如此。这将减少发行版以后决定更改 python 命令调用的 Python 解释器版本,或者系统管理员安装自定义 python 命令与发行版默认主要版本不同的情况时出现的问题。
  • 如果遵循上述观点并允许系统管理员更改 python 命令,则 python 命令应始终作为指向解释器二进制文件(或指向链接的链接)的链接实现,而不是相反。这样,如果系统管理员确实决定替换已安装的 python 文件,他们可以这样做而不会无意中删除以前安装的二进制文件。
  • 即使 Python 2 解释器变得越来越不常见,脚本继续使用 python3 约定而不是仅仅 python 仍然是合理的。
  • 如果遵守这些约定,python 命令将仅作为用户便利以交互方式执行,或者在使用虚拟环境或类似机制时执行。

向后兼容性

如果遵循 python2/python3 约定的脚本在不支持这些命令的系统上执行,可能会出现潜在问题。这通常不是问题,因为系统管理员只需创建这些符号链接即可避免进一步的问题。这比尝试使用 Python 3 解释器执行包含 Python 2 特定语法的脚本(反之亦然)时可能出现的有时令人费解的错误更明显。

对 CPython 参考解释器的应用

虽然技术上是一个新功能,但 CPython 2.7 版本的 make installmake bininstall 命令已调整为在相关 bin 目录中创建以下符号链接链(链中列出的最后一项是实际安装的二进制文件,前面的项是相对符号链接)

python -> python2 -> python2.7
python-config -> python2-config -> python2.7-config

macOS 二进制安装程序也进行了类似的调整。

此功能首次出现在 CPython 2.7.3 的默认安装过程中。

CPython 3.x 系列中的安装命令已经创建了适当的符号链接。例如,CPython 3.2 创建

python3 -> python3.2
idle3 -> idle3.2
pydoc3 -> pydoc3.2
python3-config -> python3.2-config

CPython 3.3 创建

python3 -> python3.3
idle3 -> idle3.3
pydoc3 -> pydoc3.3
python3-config -> python3.3-config
pysetup3 -> pysetup3.3

这些功能在默认安装程序中的实现进展在跟踪器上作为问题 #12627 ([3]) 进行管理。

对 PYTHON* 环境变量的影响

python 命令的目标选择隐式影响了发行版对各种 Python 相关环境变量的预期解释。在相关 site-packages 文件夹中使用 *.pth 文件、”每用户 site-packages”功能(参见 python -m site)或更灵活的工具(如 virtualenv)都比直接使用 PYTHONPATH 对系统上存在多个 Python 版本更宽容。

排除 MS Windows

本 PEP 故意排除了任何与 Microsoft Windows 相关的提议,因为为 Windows 设计一个等效的解决方案被认为过于复杂,不适合在此处处理。PEP 397 和 python-dev 邮件列表上的相关讨论解决了这个问题。

参考资料


来源:https://github.com/python/peps/blob/main/peps/pep-0394.rst

最后修改:2024-02-26 08:33:49 GMT