Как запустить программы на Python с соответствующей версией Python?

1

Учитывая набор программ python:

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

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

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

Альтернативы, которые я рассмотрел:

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

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

  • Создание своего рода взлома, чтобы каждая программа могла запускаться как в оболочке script, так и в программе python, похожей на:

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

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

Теги:
wrapper
shebang

4 ответа

1
Лучший ответ

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

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

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

4

Я знаю, что это не совсем тот ответ, который вы ищете, но я просто должен убедиться, что исполняемые файлы 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

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

#!/usr/bin/env python2.4

или

#!/usr/bin/env python2.6
1

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

python2.6 /tool/a.py

python2.4 /tool/b.py

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню