gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:45:01 24 4
gpt4 key购买 nike

我有一个使用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 后面的名称首次找到并表示您希望它的含义:

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

  • 但这一切都不是真正伟大的,最终是你所要求的。
    你的解释器(虽然这听起来比听起来更难,解释器解析代码非常简单;把它放在哪里,如何调用它以便内核找到和使用它)也可以是一个简单的 shell 脚本,它试图弄清楚你打包了你的 python 代码,但我担心你看到的任何选项都不是很好。
    有一个 PEP-394对于在类似 U*X 的系统上建议/预期的内容:
  • 你得到 python对于 python2
  • python3对于python3

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

    However, these recommendations implicitly assumed that Python 2 would always be available. As Python 2 is nearing its end of life in 2020 (PEP 373, PEP 404), distributions are making Python 2 optional or removing it entirely. This means either removing the python command or switching it to invoke Python 3. Some distributors also decided that their users were better served by ignoring the PEP's original recommendations, and provided system administrators with the freedom to configure their systems based on the needs of their particular environment.


    TL; DR 不幸的是,没有办法普遍工作并补偿各种发行版甚至个别主机维护者的决定。 :(
    我很可能会选择坚持使用 #!/usr/bin/env python3 (到目前为止,这是推荐的命名)并添加 README这解释了先决条件以及如何设置主机只是为了确定。

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

    关于python - 我应该使用什么shebang来始终指向python3?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64048813/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com