问题
I have a problem when trying to run a python script on two different computers. On each computer I would like to run the script using python version 2.7.3 however the problem I am having is that the two computers name python 2.7.3 in different ways. One of the computers runs arch linux and on this computer it is named python2. The other computer is running redhat linux and it uses the name python2.7.3.
What should I use in the shebang line so that the script is executable on both computers without requiring any changes? What I really want is some sort of conditional shebang line that could choose which version of Python to use. Am I just out of luck and I have to keep two different versions of the script?
P.S. I can't just use #!/usr/bin/env python as on the arch linux computer this would refer to python 3.2.3 and on the redhat linux computer it would refer to python 2.4.
回答1:
You can write a small wrapper script that looks through different versions of python executables and uses the one it finds.
For example:
#!/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
Of course this script is just a start sample, you could surely improve it in many ways. Just do give you an idea of what I mean.
回答2:
#!/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
taken from https://github.com/apache/cassandra/blob/trunk/bin/cqlsh
来源:https://stackoverflow.com/questions/12070516/conditional-shebang-line-for-different-versions-of-python