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

时间:2017-12-19 08:38:08

标签: python bash python-3.x shell shebang

我在python3中开发了一组脚本,就像shebang我用的那样:

#!/usr/bin/env python3

一切顺利,但在某些执行的虚拟机中,解释器的名称为python3.5。我希望能够在两个环境中执行我的脚本,但我无法更改虚拟机的文件系统(因此我放弃了从python3.5到python3的链接等解决方案)

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

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

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

python3.5 myscript.py

欢迎任何想法!谢谢!

3 个答案:

答案 0 :(得分:4)

无需引入单独的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)

答案 1 :(得分:3)

如果您可以安装脚本,还可以安装一个名为python3.5的包装器,只需调度python3

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

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

您必须在系统PATH目录之后将脚本的目录添加到python3.5 ,以避免将其置于无限循环中,并且仅使用此脚本当系统尚未提供python3.5时作为后备。

正如您所指出的,env不知道或不关心您的个人shell别名或函数,并且不提供自行运行的二进制文件的任何动态计算;但是你可以随意使用shell(当然,一旦你找到它就会使用Python!) - 它只是使用PATH所以如果你可以将其他脚本安装在{{1}中的目录中(首先必须是PATH shebang才有意义),你也可以将这个脚本存储在那里。

正如评论中所指出的那样,仅仅安装#!/usr/bin/env而不是至少可选地使python3.5成为符号链接,这是奇怪的和用户敌对的,所以也许你最终可以说服那些维护你的图像的人安装到提供这个。

答案 2 :(得分:1)

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