如何让 Shebang 能够在 python3 和 python3 之间选择正确的 Python 解释器。5

How to make the Shebang be able to choose the correct Python interpreter between python3 and python3.5

我正在 python3 中开发一套脚本,作为 shebang 我使用这个:

#!/usr/bin/env python3

一切正常,但在某些执行的虚拟机中,解释器的名称是python3.5。我希望能够在两种环境中执行我的脚本,但我无法更改虚拟机的文件系统(因此我放弃了诸如 make a link from python3.5 to python3 )

我查看了 env 的人,但我找不到任何方法来指定搜索模式或类似的东西。

我尝试在我的会话开始时设置一个 alias 指向正确的 python 解释器,但 env 不使用它。

我独特的解决方案是调用我的脚本说明必须使用哪个解释器但非常烦人:

python3.5 myscript.py

欢迎任何想法!谢谢!

如果已安装,您可以创建一个使用 python 3.5 的 shell 脚本,否则使用 python 3 并使用正确的版本执行您的脚本。
不需要 python shebang。
在您的 shell 脚本中,您可以测试是否 which python3.5 returns 某些东西;如果是,则安装 python3.5,否则您必须使用 python3

如果你可以安装脚本,你也可以安装一个名为 python3.5 的包装器,它只是调度 python3.

#!/bin/sh
exec env python3 "$@"

您显然需要 chmod a+x 这个脚本,就像您安装的其他脚本一样。

您必须将脚本的目录添加到您的 PATH 系统 python3.5 目录之后,以避免陷入无限循环,并且仅在系统尚未提供 python3.5.

时将此脚本用作后备

如您所述,env 不知道或不关心您的个人 shell 别名或函数,并且不提供对 运行 的二进制文件的任何动态计算通过它自己;但是你可以随意使用 shell(当然还有 Python,一旦你找到它!)——它只是使用 PATH 所以如果你可以在一个目录中安装你的其他脚本它在您的 PATH 中(首先 #!/usr/bin/env shebang 必须是这种情况才有意义)您也可以将此脚本存储在那里。

如评论中所述,仅安装 python3.5 而不是至少选择性地使 python3 成为它的符号链接,这很奇怪并且对用户怀有敌意,因此也许您最终可以说服维护图像的人您正在安装以提供此功能。

无需引入单独的shell和python脚本,一个文件即可!

用这个序列替换你的 shebang 行:

#!/bin/sh

# Shell commands follow
# Next line is bilingual: it starts a comment in Python, and is a no-op in shell
""":"

# Find a suitable python interpreter (adapt for your specific needs) 
for cmd in python3.5 python3 /opt/myspecialpython/bin/python3.5.99 ; do
   command -v > /dev/null $cmd && exec $cmd [=10=] "$@"
done

echo "OMG Python not found, exiting!!!!!11!!eleven" >2

exit 2

":"""
# Previous line is bilingual: it ends a comment in Python, and is a no-op in shell
# Shell commands end here
# Python script follows (example commands shown)

import sys
print ("running Python!")
print (sys.argv)