在shebang中引用python26还是python2.6
我需要一个特定版本的Python来运行我的脚本。目前我安装的Python 2.6里有两个命令,一个是python26,另一个是python2.6。
我应该在开头的那一行(shebang)写哪个呢?
选项1:
#!/usr/bin/env python2.6
选项2:
#!/usr/bin/env python26
补充说明:是的,我不想用普通的python是有原因的。在我们大学的一些环境中,python链接的是python2.4,而我的代码用到了很多2.6的特性。
3 个回答
你为什么不直接用 /usr/bin/python
呢?有没有什么特别的原因不这样做?
如果你还没有这个链接,可以用下面的命令来创建一个:
ln -s /usr/bin/python26 /usr/bin/python
这样做可以确保将来如果你升级了Python,依然能保持兼容性。
你不能总是保证会使用到shebang(脚本开头的那行代码),或者用户可能根本没有安装你指定的版本。
其实不应该限制到某个特定版本。最好是要求至少有某个版本(比如你的代码在Python 2.6上能跑,那为什么在Python 2.7上就不能跑呢?我可能过几个月就不再安装Python 2.6了)。
我建议使用 /usr/bin/env python
作为shebang,然后动态检测版本。相信我,通常的做法是这样的:
import sys
ver = sys.version[:3]
这样你会得到一个三位数的字符串,比如 "2.6" 或 "2.7"。我会检查第一个字符是否是 '2'(假设你想防止Python 3运行你的脚本,因为它们大部分不兼容),并且第三个字符要大于等于 '6'。
编辑:参考Petr的评论 -- 用 sys.version_info[0:2]
来替代(这样会给你一对像 (2, 6)
或 (2, 7)
的值)。
我刚在我的Linux系统上查看了一下,发现只有python2.6
,没有python26
,所以前者看起来更好。
为了更清楚一点,我会使用条件导入。在我的情况下,我需要OrderedDict
,这个只有在python 2.7及以上版本才有。
try:
from collections import OrderedDict
except ImportError:
print("Python 2.7+ is needed for this script.")
sys.exit(1)