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?
不幸的是,没有一种通用的工作方式可以在任何和所有未知的 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
了python2python3
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
在搜索路径中有可执行文件,如果没有,则创建一个符号链接。