我应该使用什么shebang来始终指向python3?

Ars*_*nko 6 python shebang python-3.x

我有一个使用 shebang 的脚本#!/usr/bin/env python。它在 Python 3 是唯一可用版本的机器上运行良好,但在同时具有 Python 2 和 Python 3 的机器上,它使用 Python 2 运行脚本。

如果我将 shebang 修改为#!/usr/bin/env python3,它可以在使用 Python 2 和 Python 3 的机器上运行,但在只有 Python 3 的机器上,它会失败并显示“没有这样的文件或目录”错误。

一种解决方案是创建别名alias python=python3

是否有其他解决方案可以在每台机器上统一工作相同的shebang?

Ond*_* K. 5

不幸的是,没有一种通用的工作方式可以在任何和所有未知的 Linux 主机上工作,而且您在很大程度上受发行版维护者和本地主机配置的支配。

alias不会有帮助,因为#!由内核处理指定的解释器,/usr/bin/env在这种情况下它会执行不知道你的 shell 的别名。

使用时env,您可以确保以下名称env首先找到并表示您希望它的含义:

  • 确保所有主机在这方面的设置方式相同(安装了预期的打包或至少创建了符号链接)
  • 具有用于执行脚本的用户特定构造,例如:
    mkdir /tmp/bin
    ln -s /usr/bin/python /tmp/bin/python3
    PATH="/tmp/bin:${PATH}" ./myscript.py
    
    Run Code Online (Sandbox Code Playgroud)

但这一切都不是真正伟大的,最终是你所要求的。

你的解释器(虽然这听起来比听起来更难,解释器解析代码非常简单;把它放在哪里,如何调用它以便内核找到和使用它)也可以是一个简单的 shell 脚本,它试图弄清楚你打包了你的 python 代码,但我担心你看到的任何选项都不是很好。

有一个PEP-394用于在类似 U*X 的系统上建议/预期的内容:

  • 你得到python了python2
  • python3python3

但它承认这从未完全一致地应用......而且在 2020 年也没有那么有用:

但是,这些建议隐含地假设 Python 2 始终可用。随着 Python 2 在 2020 年接近其生命周期(PEP 373、PEP 404),发行版正在使 Python 2 成为可选或完全删除它。这意味着要么删除 python 命令,要么将其切换为调用 Python 3。一些发行商还认为,忽略 PEP 的原始建议可以更好地为他们的用户提供服务,并为系统管理员提供了根据其特定需求配置系统的自由环境。

TL; DR 不幸的是,没有办法普遍工作并补偿各种发行版甚至个别主机维护者的决定。:(

我很可能会选择坚持使用#!/usr/bin/env python3(迄今为止一直是推荐的命名)并添加一个README解释先决条件以及如何设置主机以确保安全。


为了完整起见,我应该补充一下,PEP 确实在这方面提出了建议:设置和使用虚拟环境或使用(第三方)环境管理器。然而,我阅读问题的方式:“便携式解释器规范不对目标主机配置做出任何假设,也不对目标主机配置提出任何(额外)要求”,这将不符合要求,也不意味着比说:做的实质性改进确保您python3在搜索路径中有可执行文件,如果没有,则创建一个符号链接。