Учитывая набор программ 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()
Есть ли у вас другие идеи?
Я бы пошел с опцией 3. У него будет небольшая задержка запуска, но это самый гибкий вариант.
Один из них не работает, поскольку вы работаете в смешанных средах, это будет кошмар, чтобы все правильно настроить.
Будет работать, но, как вы сказали, вам нужно будет поддерживать как .py-программу, так и оболочку script. Также он не сильно отличается от 3.
Я знаю, что это не совсем тот ответ, который вы ищете, но я просто должен убедиться, что исполняемые файлы 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 и использовал env
, чтобы обойти ограничение интерпретатора. Обратите внимание, что Python уже создал version- определенные двоичные файлы в /usr/bin
(это было в моей системе):
#!/usr/bin/env python2.4
или
#!/usr/bin/env python2.6
Вы можете напрямую форсировать интерпретатор Python, задав параметр .py file для двоичного кода Python:
python2.6 /tool/a.py
python2.4 /tool/b.py
Чтобы поддерживать различные среды Python и различные зависимости (яйца Python или собственные расширения) для каждого инструмента, который вы хотите использовать virtualenv: