我有这个问题:
System A
运行 Ubuntu 并且需要 Python 2.6
来处理许多不同的事情。
我在 System A
上单独安装了 Python 2.7
系统 B
native 具有 Python 2.7
。
我有一个 python 脚本 BLAH
,上面写着 #!/bin/env python
。
再往下它会执行另一个脚本 SIGH
,它在顶部还显示:#!/bin/env python
。
BLAH
需要在 System A
或 System B
上运行,并且始终需要运行 Python 2.7
----
到目前为止我的部分解决方案:
有一个包装器脚本,它首先尝试查看 which python
是否指向 Python 2.7
如果没问题,则使用该 python 路径运行 BLAH
。
否则尝试 which python2.7
并使用该路径运行 BLAH
,并将该路径添加到 env PATH
。
此解决方案的问题是:
在 System A
上(单独安装了 Python 2.7)
当 BLAH
执行时,由于我编写的包装器脚本,它使用 Python 2.7 运行(到目前为止还好..)
当 BLAH
产生 SIGH
时,SIGH
使用 shebang 在路径中查找 python 然后它遇到了麻烦,因为它正在寻找 python in env
的 PATH
,它应该在路径中寻找 python2.7
。
有没有一种干净的方法来处理这个问题?
提前致谢!
最佳答案
如果您的脚本需要特定的 python 版本,例如 2.7,我会将第一行更改为
#!/bin/env python2.7
然后确保 python2.7
在您的路径上(您可能需要根据需要添加符号链接(symbolic link))。在我使用的所有发行版中,这些符号链接(symbolic link)已经存在。
(事实上,python
通常是 pythonX
的符号链接(symbolic link),pythonX
是 pythonX.Y
的符号链接(symbolic link),或者,在我的例子中,python -> python2 -> python2.7
。)
无需对完整路径进行硬编码,因为这可能因发行版与发行版或盒子而异。
但是由于路径上名为 python2.7
的可执行文件应该没有歧义,因此您应该没问题,而不必担心硬编码路径。
或者,您可以从第一个脚本中直接调用 python 解释器,如下所示:
subprocess.Popen(['pythonX.Y', SCRIPT_NAME])
代替
subprocess.Popen([SCRIPT_NAME])
编辑 正如 J.F. Sebastian 在评论中指出的那样,您可以使用 sys.executable在第一个参数中确保第二个脚本被传递给与第一个相同的解释器。例如
subprocess.Popen([sys.executable, SCRIPT_NAME])
作为旁注,这可能有用也可能没用,您可以通过以下方式访问脚本内“当前”Python 解释器的版本
import sys
print(sys.hexversion)
这可能有助于确定是否正在运行正确的解释器。
关于python - 当 python 文件必须使用 #!/bin/env python 时处理多个 python 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11319676/