Я нахожусь в некоторой интересной ситуации, когда у меня есть сценарий Python, который теоретически может запускаться различными пользователями с различными средами (и PATH) и на различных системах Linux. Я хочу, чтобы этот скрипт выполнялся на максимально возможном количестве без искусственных ограничений. Вот некоторые известные настройки:
- Python 2.6 является системной версией Python, поэтому python, python2 и python2.6 все существуют в / usr / bin (и эквивалентны).
- Python 2.6 - это системная версия Python, как и выше, но Python 2.7 устанавливается вместе с ним как python2.7.
- Python 2.4 - это системная версия Python, которую мой скрипт не поддерживает. В / usr / bin у нас есть python, python2 и python2.4, которые эквивалентны, и python2.5, который поддерживает скрипт.
Я хочу запустить один и тот же исполняемый скрипт на всех трех из них. Было бы хорошо, если бы он попытался сначала использовать /usr/bin/python2.7, если он существует, затем вернуться к /usr/bin/python2.6, а затем вернуться к /usr/bin/python2.5, а затем просто ошибка, если ни один из них не присутствовал. Я не слишком одержим этим, используя самую последнюю возможную версию 2.x, однако, если она способна найти одного из правильных переводчиков, если он присутствует.
Моим первым желанием было изменить строку Шебанга с:
#!/usr/bin/python
в
#!/usr/bin/python2.[5-7]
так как это хорошо работает в Bash. Но запуск скрипта дает:
/usr/bin/python2.[5-7]: bad interpreter: No such file or directory
Итак, я попробую следующее, которое также работает в Bash:
#!/bin/bash -c /usr/bin/python2.[5-7]
Но опять же, это не с:
/bin/bash: - : invalid option
Хорошо, очевидно, я мог бы просто написать отдельный скрипт оболочки, который находит правильный интерпретатор и запускает скрипт python, используя любой интерпретатор, который он нашел. Мне просто было бы неудобно распространять два файла, где одного должно хватить, если он работает с самым современным установленным интерпретатором Python 2. Просить людей явно вызывать переводчика (например, $ python2.5 script.py
) не вариант. Полагаться на то, что PATH пользователя настроен определенным образом, также не вариант.
Редактировать:
Проверка версий в скрипте Python не будет работать, так как я использую оператор «с», который существует в Python 2.6 (и может использоваться в 2.5 с from __future__ import with_statement
). Это приводит к немедленному сбою сценария с недружественным для пользователя SyntaxError и лишает меня возможности когда-либо сначала проверить версию и выдать соответствующую ошибку.
Пример: (попробуйте это с интерпретатором Python менее 2.6)
#!/usr/bin/env python
import sys
print "You'll never see this!"
sys.exit()
with open('/dev/null', 'w') as out:
out.write('something')
./script.py
Е.) Заставит python2.4 выполнить его, что заставит ваш код обнаружить, что это была неправильная версия (и, по-видимому, выход). Но есть совершенно хороший python2.5, который можно было бы использовать вместо интерпретатора!
exec
если да, то выведите ошибку.
execve
). Аргументы - строковые литералы, без глобализации, без регулярных выражений. Вот и все. Даже если первый аргумент - «/ bin / bash», а второй параметр («-c ...»), эти параметры не анализируются оболочкой. Они передаются необработанным в исполняемый файл bash, поэтому вы получаете эти ошибки. Плюс, шебанг работает, только если он в начале. Боюсь, вам здесь не повезло (если не считать сценария, который находит интерпретатора python и передает его в ЗДЕСЬ документ, который звучит как ужасный беспорядок).
import sys; sys.version_info()
чтобы проверить, есть ли у пользователя требуемая версия Python.