Условная строка shebang для разных версий Python

У меня возникла проблема при попытке запустить python script на двух разных компьютерах. На каждом компьютере я хотел бы запустить script с помощью python версии 2.7.3, однако проблема, с которой я столкнулась, заключается в том, что оба компьютера называют python 2.7.3 разными способами. Один из компьютеров запускает arch linux, и на этом компьютере он называется python2. На другом компьютере работает redhat linux, и он использует имя python2.7.3.

Что следует использовать в строке shebang так, чтобы script выполнялся на обоих компьютерах без каких-либо изменений? То, что я действительно хочу, это какая-то условная линия shebang, которая может выбрать, какую версию Python использовать. Мне просто не повезло, и мне нужно сохранить две разные версии script?

P.S. Я не могу просто использовать #!/Usr/bin/env python, как на компьютере с архитектурой linux, это относится к python 3.2.3, а на компьютере Redhat Linux он будет ссылаться на python 2.4.

Ответ 1

Вы можете написать небольшую обертку script, которая просматривает разные версии исполняемых файлов 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

Конечно, это script - это всего лишь образец запуска, вы наверняка улучшили бы его разными способами. Просто дайте вам представление о том, что я имею в виду.

Ответ 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" "[email protected]"
for pyver in 2.6 2.7 2.5; do
    which python$pyver > /dev/null 2>&1 && exec python$pyver "$0" "[email protected]"
done
echo "No appropriate python interpreter found." >&2
exit 1
":"""

import sys
print sys.version

взято из https://github.com/apache/cassandra/blob/trunk/bin/cqlsh