我处于一个有趣的情况,我有一个Python脚本,理论上可以由具有各种环境(和PATH)的各种用户以及各种Linux系统上运行。我希望此脚本在尽可能多的可执行文件上不受人为限制。以下是一些已知的设置:
- Python 2.6是系统Python版本,因此python,python2和python2.6都存在于/ usr / bin中(并且是等效的)。
- 如上所述,Python 2.6是系统Python版本,但Python 2.7与python2.7一同安装。
- Python 2.4是系统Python版本,我的脚本不支持该版本。在/ usr / bin中,我们有等效的python,python2和python2.4,以及脚本支持的python2.5。
我想对所有这三个脚本运行相同的可执行python脚本。如果它先尝试使用/usr/bin/python2.7(如果存在),然后回退至/usr/bin/python2.6,然后回退至/usr/bin/python2.5,然后再回退,那就太好了如果这些都不存在,就简单地将错误提示出来。不过,我不太可能使用最新的2.x,只要它能够找到正确的解释器之一(如果存在)。
我的第一个倾向是将shebang线从以下位置更改:
#!/usr/bin/python
至
#!/usr/bin/python2.[5-7]
因为这在bash中效果很好。但是运行脚本可以得到:
/usr/bin/python2.[5-7]: bad interpreter: No such file or directory
好的,所以我尝试以下方法,它也可以在bash中使用:
#!/bin/bash -c /usr/bin/python2.[5-7]
但是,再次失败:
/bin/bash: - : invalid option
好的,显然我可以编写一个单独的shell脚本来找到正确的解释器,并使用找到的任何解释器运行python脚本。我会发现分发两个文件很麻烦,只要在安装了最新的python 2解释器的情况下运行一个文件就足够了。要求人们明确地调用解释器(例如$ python2.5 script.py
)不是一种选择。也不能选择依靠用户的PATH进行某种设置。
编辑:
版本的Python脚本内检查是不是因为我用它存在像Python 2.6的(并可以在2.5与所使用的“与”语句去上班from __future__ import with_statement
)。这会导致脚本立即失败,并出现用户不友好的SyntaxError,并阻止我有机会先检查版本并发出适当的错误。
示例:(使用小于2.6的Python解释器尝试此操作)
#!/usr/bin/env python
import sys
print "You'll never see this!"
sys.exit()
with open('/dev/null', 'w') as out:
out.write('something')
./script.py
)将导致python2.4执行它,这将导致您的代码检测到它是错误的版本(并退出了,大概是这样)。但是有一个非常好的python2.5可以代替解释器!
exec
,请打印,否则输出错误。
execve
)。参数是字符串文字,没有glob,没有regexp。而已。即使第一个arg是“ / bin / bash”而第二个选项(“ -c ...”)也不会被shell解析。它们未经处理就交给了bash可执行文件,这就是为什么您会得到这些错误的原因。另外,shebang仅在开始时才起作用。因此,恐怕您不走运(缺少找到python解释器并向其提供HERE文档的脚本,听起来像是一团糟)。
import sys; sys.version_info()
用来检查用户是否具有所需的python版本。