我正在编写必须在许多不同类UNIX版本上运行的脚本。 这些是用python 2.x编写的。
不幸的是,一些较新版本已经采用调用这种风格二进制文件“python2”而不是“python”。因此,“#!/ usr / bin / env python”无法查找正确安装的python解释器。要么我得到版本3解释器(坏)或根本没有解释器(更糟糕!)
是否有一种聪明的方法来编写python脚本,以便在安装时使用python2解释器加载,否则python解释器是否已安装?我必须使用其他机制来检测“python”何时是python3,但是当我在那个类似python的环境中时,我可以忍受它。
我想我可以写一个涟漪发射器,称之为“findpython2”,并将其用作#!脚本的解释器,但这意味着我必须在搜索路径中安装findpython2,这绝对是次优的(这些脚本通常由绝对引用调用,因此它们不在路径中。)
答案 0 :(得分:6)
从着名的perl hashbang技巧中获取灵感,我想出了这个:
#!/bin/sh
"""":
python2 -c "" 2>/dev/null && exec python2 $0 ${1+"$@"}
python -c "" 2>/dev/null && exec python $0 ${1+"$@"}
echo "Could not find a python interpreter."
exit 1
"""
print "hello python"
答案 1 :(得分:4)
unix方式是指定python2
- 大多数好的发行版现在将2.x设置为python2
而3.x设置为python3
,将 main <连接到< / em>一到python
(在大多数发行版中,2.x)。因此,最好明确指定一个。
这是PEP 394中定义的所有内容:
此PEP提供了一个确保Python脚本可以使用的约定 无论默认设置如何,都可以在* nix系统中继续移植 Python解释器的版本(即由。调用的版本) python命令)。
- python2将引用某些版本的Python 2.x
- python3将引用某些版本的Python 3.x
- python应该引用与python2相同的目标,但可能会在某些前沿分布上引用python3
因此,如果发行版没有这样做,那么它本质上就是一个错误。
答案 2 :(得分:0)
如果您必须在python 2
上运行,最好还将解释程序称为python2
。我认为大多数UNIX版本都有/usr/bin/python/
和/usr/bin/python2
的符号链接到相应的二进制文件。