Как запустить программы на Python с соответствующей версией Python? - PullRequest
1 голос
/ 09 июня 2011

Имеется набор программ на Python:

/tool/a.py
/tool/b.py
/tool/c.py
/tool/d.py
...

, которые хранятся в общем сетевом каталоге, выполняются в смешанной среде (Solaris и в разных версиях Linux) и для которых требуется определенная версия Python, котораяможет не входить в пользовательский $ PATH и не может быть установлен в одном и том же месте на разных типах машин.

Как программы могут указать, какой интерпретатор python использовать?

Альтернативы I 'мы рассмотрели:

  1. Шебанг в каждой программе на Python, ссылающийся на оболочку Python, которая запускает соответствующий интерпретатор Python для текущего типа машины.Но execve не позволяет реализовать исполняемый файл оболочки в виде сценария оболочки, и компиляция собственных исполняемых файлов для каждой машины потребует большого количества обслуживания.

  2. Создание сценария оболочки запуска для каждой программы python,Все сценарии оболочки могут использовать одну и ту же логику для выбора интерпретатора Python, но я бы хотел, если это возможно, избежать использования отдельного сценария оболочки для каждой программы Python.

  3. Создание некоторого видаВзломать, чтобы каждая программа могла запускаться как в виде сценария оболочки, так и в виде программы на Python, например:

"""exec" /tool/python_wrapper "$0" "$@" """#"
def foo():
print "foo"
foo()

У вас есть другие идеи?

Ответы [ 4 ]

4 голосов
/ 09 июня 2011

Я знаю, что это не совсем тот ответ, который вы ищете, но я бы просто убедился, что исполняемые файлы python находятся в PATH, а затем использую env, чтобы найти их.В конечном счете, я думаю, что это будет намного меньше обслуживания и головной боли.Например,

#!/usr/bin/env python2.5
print "Hello from python 2.5!"

#!/usr/bin/env python2.6
print "Hello from python 2.6!"

#!/usr/bin/env python2.7
print "Hello from python 2.7!"
1 голос
/ 09 июня 2011

Вы можете напрямую заставить интерпретатор Python, передав параметр .py для двоичного файла Python:

python2.6 /tool/a.py

python2.4 /tool/b.py

Для поддержки разных сред Python и разных зависимостей (яиц Python или собственных расширений) для каждого инструмента, который вы хотите использовать virtualenv:

http://pypi.python.org/pypi/virtualenv

1 голос
/ 09 июня 2011

Я бы выбрал вариант # 1 и использовал бы env, чтобы обойти ограничение интерпретатора.Обратите внимание, что Python, возможно, уже создал специфичные для версии двоичные файлы в /usr/bin (это было сделано в моей системе):

#!/usr/bin/env python2.4

или

#!/usr/bin/env python2.6
1 голос
/ 09 июня 2011

Я бы выбрал вариант 3. У него будет небольшая задержка запуска, но это наиболее гибкий вариант.

  1. Один не будет работать, так как вы работаете в смешанных средахэто будет кошмар, чтобы правильно все настроить.

  2. Будет работать, но, как вы сказали, вам нужно будет поддерживать как программу .py, так и скрипт оболочки.И не сильно отличается от 3.

...