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

2024-02-21

我有一个使用 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 在每台机器上统一工作?


不幸的是,没有一种通用的方法可以在任何和所有未知的 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
    

但这些都不是真正伟大的,最终也不是您所要求的。

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

有一个PEP-394 https://www.python.org/dev/peps/pep-0394/对于类 U*X 系统上建议/期望的内容:

  • you get python对于Python2
  • and python3对于Python3

但它认识到这一点从未得到完全一致的应用……而且在 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搜索路径中的可执行文件,如果没有则创建符号链接。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我应该使用什么 shebang 来始终指向 python3? 的相关文章

随机推荐