适用于不同版本Python的条件shebang行



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

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

附言:我不能只使用#/usr/bin/env-python在arch-linux计算机上指的是python 3.2.3,在redhat-linux电脑上指的则是python 2.4。

#!/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

您可以编写一个小型包装器脚本,该脚本可以查看不同版本的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

当然,这个脚本只是一个开始的示例,您肯定可以在许多方面对其进行改进。只要让你明白我的意思就行了。

最新更新