脚本Hashbang:如何获得python 2解释器?

时间:2012-09-26 16:31:51

标签: python linux shell unix python-2.7

我正在编写必须在许多不同类UNIX版本上运行的脚本。 这些是用python 2.x编写的。

不幸的是,一些较新版本已经采用调用这种风格二进制文件“python2”而不是“python”。因此,“#!/ usr / bin / env python”无法查找正确安装的python解释器。要么我得到版本3解释器(坏)或根本没有解释器(更糟糕!)

是否有一种聪明的方法来编写python脚本,以便在安装时使用python2解释器加载,否则python解释器是否已安装?我必须使用其他机制来检测“python”何时是python3,但是当我在那个类似python的环境中时,我可以忍受它。

我想我可以写一个涟漪发射器,称之为“findpython2”,并将其用作#!脚本的解释器,但这意味着我必须在搜索路径中安装findpython2,这绝对是次优的(这些脚本通常由绝对引用调用,因此它们不在路径中。)

3 个答案:

答案 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的符号链接到相应的二进制文件。