python - 当 python 文件必须使用 #!/bin/env python 时处理多个 python 版本

标签 python shebang

我有这个问题:

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 ASystem 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 envPATH,它应该在路径中寻找 python2.7

有没有一种干净的方法来处理这个问题?

提前致谢!

最佳答案

如果您的脚本需要特定的 python 版本,例如 2.7,我会将第一行更改为

#!/bin/env python2.7

然后确保 python2.7 在您的路径上(您可能需要根据需要添加符号链接(symbolic link))。在我使用的所有发行版中,这些符号链接(symbolic link)已经存在。

(事实上,python 通常是 pythonX 的符号链接(symbolic link),pythonXpythonX.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/

相关文章:

Python 源头注释

unix - 可移植社帮线

java - 从文件中获取一个重复的字段而不需要加载整个文件

python - 将下拉值的选定选项的值传递给django数据库

python - 为类构造函数提供默认值的大多数 Python 方式

shell - Hashbang 不支持带参数的参数

python - 直接从命令行运行 python 脚本

bash - 使用 echo 生成 bash 脚本,shebang 行有问题

python - 列表乘积的递归函数不起作用

python - Matplotlib 日期操作,使年刻度每 12 个月出现一次