不同版本 Python 的条件 shebang 行

Posted

技术标签:

【中文标题】不同版本 Python 的条件 shebang 行【英文标题】:Conditional shebang line for different versions of Python 【发布时间】:2012-08-17 17:20:39 【问题描述】:

尝试在两台不同的计算机上运行 python 脚本时遇到问题。在每台计算机上,我想使用 python 版本 2.7.3 运行脚本,但是我遇到的问题是两台计算机以不同的方式命名 python 2.7.3。其中一台计算机运行arch linux,在这台计算机上它被命名为python2。另一台计算机正在运行redhat linux,它使用名称python2.7.3。

我应该在 shebang 行中使用什么,以便脚本可以在两台计算机上执行而无需任何更改?我真正想要的是某种可以选择使用哪个版本的 Python 的有条件的 shebang 行。我是不是运气不好,必须保留两个不同版本的脚本?

附:我不能只使用 #!/usr/bin/env python,因为在 arch linux 计算机上它指的是 python 3.2.3,而在 redhat linux 计算机上它是指 python 2.4。

【问题讨论】:

一个很棒的问题。请注意,推荐的做法(根据 PEP-394)建议将 python2.x 符号链接为python2,所以这实际上是代表 redhat 的一个打包问题(在其他发行版中)。 为什么不能在每台计算机中定义一个新的变量来链接python2.7.3?还是只是一个链接? 你总是可以选择python2.7.3 my-program.py :) 我会使用 #!/usr/bin/env python#!/usr/bin/env python2 并保护与版本相关的代码,并明确检查适当的 Python 版本(使用 sys.version_info)。如果失败了,那么 simlinks 或@Shaung 的解决方案是最简单的。 【参考方案1】:
#!/bin/sh
# -*- mode: Python -*-

""":"
# bash code here; finds a suitable python interpreter and execs this file.
# prefer unqualified "python" if suitable:
python -c 'import sys; sys.exit(not (0x020500b0 < sys.hexversion < 0x03000000))' 2>/dev/null \
    && exec python "$0" "$@"
for pyver in 2.6 2.7 2.5; do
    which python$pyver > /dev/null 2>&1 && exec python$pyver "$0" "$@"
done
echo "No appropriate python interpreter found." >&2
exit 1
":"""

import sys
print sys.version

取自https://github.com/apache/cassandra/blob/trunk/bin/cqlsh

【讨论】:

【参考方案2】:

您可以编写一个小包装脚本,查看不同版本的 python 可执行文件并使用它找到的那个。

例如:

#!/bin/sh -e
pythons=('python2', 'python2.7.3')
for py_exec in $pythons[@]; do
    py_exec="/usr/bin/$py_exec"
    if [[ -f $py_exec ]]; then
        exec $py_exec $1
    fi
done

当然,这个脚本只是一个开始示例,您当然可以通过多种方式对其进行改进。请务必让您了解我的意思。

【讨论】:

以上是关于不同版本 Python 的条件 shebang 行的主要内容,如果未能解决你的问题,请参考以下文章

使用#!/ usr / bin / env python3 shebang和Windows

如何使用 Shebang Line (Python 虚拟环境)

如何使用 Shebang Line (Python 虚拟环境)

bash的算术运算和条件测试语句

shell脚本,测试

shell脚本,测试