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

问题描述 投票:3回答:3

我正在python3中开发一组脚本,因为shebang我用它:

#!/usr/bin/env python3

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

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

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

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

python3.5 myscript.py

欢迎任何想法!谢谢!

python bash python-3.x shell shebang
3个回答
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)

3
投票

如果你可以安装脚本,你也可以安装一个名为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成为符号链接是奇怪的和用户敌意的,所以也许你最终可以说服维护你正在安装的图像的人提供这个。


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.