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

如何使Shebang能够在python3和python3.5之间选择正确的Python解释器,python,bash,python-3.x,shell,shebang,Python,Bash,Python 3.x,Shell,Shebang,我正在用python3开发一套脚本,因为shebang使用了以下内容: #!/usr/bin/env python3 一切正常,但在一些执行解释器的虚拟机中,解释器的名称是python3.5。我希望能够在这两种环境中执行我的脚本,但我无法更改虚拟机的文件系统(因此我放弃了从python3.5链接到python3的解决方案) 我看了《环境之人》,但我找不到任何方法来指定搜索模式或类似的东西 我试图在会话开始时设置一个指向右侧python解释器的别名,但env不使用它 我的独特解决方案是调用我的脚

我正在用python3开发一套脚本,因为shebang使用了以下内容:

#!/usr/bin/env python3
一切正常,但在一些执行解释器的虚拟机中,解释器的名称是
python3.5
。我希望能够在这两种环境中执行我的脚本,但我无法更改虚拟机的文件系统(因此我放弃了从python3.5链接到python3的解决方案)

我看了《环境之人》,但我找不到任何方法来指定搜索模式或类似的东西

我试图在会话开始时设置一个指向右侧python解释器的
别名,但env不使用它

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

python3.5 myscript.py

欢迎任何意见!,谢谢

如果安装了python 3.5,您可以创建一个使用它的shell脚本,否则将使用python 3并以正确的版本执行脚本。
不需要python shebang。

在shell脚本中,您可以测试
哪个python3.5
返回了什么;如果可以,则安装python3.5,否则您必须使用
python3
如果您可以安装脚本,还可以安装一个名为
python3.5
的包装器,它只发送
python3

#!/bin/sh
exec env python3 "$@"
显然,您需要像安装其他脚本一样
chmoda+x
此脚本

您必须将脚本的目录添加到系统
python3.5
目录之后的
路径中,以避免陷入无休止的循环,并且仅当系统尚未提供
python3.5
时,才使用此脚本作为备用

正如您所指出的,
env
不知道或不关心您的个人shell别名或函数,也不提供二进制文件的任何动态计算;但是您可以使用shell(当然还有Python,一旦找到它!)——它只使用
路径
,因此如果您可以将其他脚本安装在
路径
中的目录中(这必须是
#!/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 $0 "$@"
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)

哪一个可怜的发行版只安装
python3.5
,而不将其本身作为指向
python3
的符号链接?如果无法将脚本存储在磁盘上,如何安装脚本?@tripleee问得好!,我在r/w区域从subversion签出。。。。的确,我不能更改已安装的系统,但我可以创建一些中间脚本。为什么不创建一个“引导”脚本来检查
.py
文件并根据当前环境调整它们的shebang?谢谢,但我不能更改虚拟机的文件系统,所以,无论您在哪里使用
#存储Python文件,我都无法安装脚本/usr/bin/env python3.5
shebang,您还可以存储此包装器脚本。你不可能实现一个,但不能实现另一个。正如我指出的,我不能改变系统,我只有一个可以写的文件夹,我在那里签出我的脚本。所以把这个脚本也存储在那里。可能实际上调用这个
python3
,让它分派
python3.5
,而不是反过来。然后你就可以保持
#/usr/bin/env python3
这在您的sicko环境之外也有意义。谢谢,但我无法更改虚拟机的文件系统,因此我无法安装脚本非常感谢!,这正是我想要的。我必须承认,这是一个非常巧妙的解决方法,再次感谢我所学到的!我希望我能投两次赞成票。这是一个非常好的答案,我已经搜索了很长时间。哇,这个代码是纯金的。修复了我的非常棘手的情况,在我无法控制的环境中,当Python 2是默认值时,我不得不运行Python 3。做得好!我对这个答案投了赞成票,并说了“谢谢”(一些新的SO特性),我希望我能给出更多。即使在2020年,对于需要更新版本的Python(如3.7或3.8)的可执行脚本的处理来说,这也是非常出色的,并且必须处理这样一个事实,即较旧的操作系统将使用它们作为
python3.7
/
python3.8
——但较新的操作系统可能只使用
python3