Есть ли стандартный способ убедиться, что скрипт python будет интерпретироваться python2, а не python3?
Есть ли стандартный способ убедиться, что скрипт python будет интерпретироваться python2, а не python3? В моем дистрибутиве я могу использовать #!/ Usr/bin/env python2 в качестве shebang, но, похоже, не все дистрибутивы поставляются "python2". Я мог бы явно назвать конкретную версию (например, 2.6) Python, но это исключило бы людей, у которых нет этой версии.
Мне кажется, что это будет все более серьезной проблемой, когда дистрибутивы начнут использовать python3 в качестве интерпретатора python по умолчанию.
8 ответов
Это немного запутанная проблема в течение очень длительного периода времени перехода. К сожалению, нет надежного, кроссплатформенного способа гарантировать, какая версия Python вызывается, кроме как проверять сам скрипт Python после запуска. Многие, если не большинство, дистрибутивы, которые поставляют Python 3, обеспечивают общий python
по умолчанию команда имеет псевдоним самой последней версии Python 2 python3
является псевдонимом для самого последнего Python 3. Те дистрибутивы, которые не следует поощрять делать это. Но нет никакой гарантии, что пользователь не переопределит это. Я думаю, что наилучшая практика, доступная в обозримом будущем, заключается в том, чтобы упаковщики, дистрибьюторы и пользователи могли предполагать, что python
ссылается на Python 2 и, при необходимости, встроить проверку времени выполнения в сценарий.
http://docs.python.org/library/sys.html
используя модуль sys, вы можете определить версию Python, которая работает, и вызвать исключение или выйти или что угодно.
ОБНОВИТЬ:
Вы можете использовать это для вызова соответствующего переводчика. Например, установите небольшой скрипт, который выполняет проверку за вас, и используйте его в shbang. Он проверит работающую версию Python и, если не то, что вы хотите, ищет ту, которую вы хотите. Затем он запустит скрипт в этой версии python (или потерпит неудачу, если ничего хорошего не будет найдено).
С помощью sys.version_info
Вы можете сделать простой тест на ценность. Например, если вы хотите поддерживать только версию 2.6 или ниже:
import sys
if sys.version_info > (2,6):
sys.exit("Sorry, only we only support up to Python 2.6!")
Я полагаю, это зависит от того, как вы это распространяете.
Если вы используете нормальный setup.py
файл для управления вашим дистрибутивом, запустите его, если пользователь пытается установить его в Python 3.
После установки сценарий консольного скрипта, созданного (скажем) setuptools, вероятно, будет связан с конкретным интерпретатором, использованным для его установки.
Если вы делаете что-то странное для вашей установки, вы можете в любом используемом сценарии установки найти интерпретаторы Python и сохранить выбор. Вы могли бы сначала проверить, является ли то, что называется "питоном", 2.x. Если нет, проверьте "python2.7", "python2.6" и т. Д., Чтобы увидеть, что доступно.
Не совсем та же ситуация, но у компании, в которой я работаю, есть приложение, которое может запускать скрипты Python (среди многих его функций). После многочисленных проблем поддержки, связанных с установкой Python на различных платформах, мы решили просто установить наш собственный интерпретатор Python вместе с приложением. Таким образом, мы точно знаем, где он установлен и в какой версии. Этот подход может быть слишком тяжелым для ваших нужд (пакет Python составляет всего около 10% от нашего приложения), но он определенно работает.
Как я понимаю, разные дистрибутивы будут находиться в разных местах вашего диска. Вот некоторые предложения, которые приходят на ум -
- Вы можете использовать псевдоним UNIX для создания ярлыков, указывающих на разные дистрибутивы. Например: псевдоним py2="/usr/bin/python2.X". Поэтому, когда вы запускаете свой скрипт, вы можете использовать py2 xx.py
- Или другой способ - изменить переменную окружения PYTHON_PATH.
- Или, если я не ошибаюсь, в модуле sys есть положение для получения текущего номера версии Python. Вы можете получить это и иметь дело соответственно.
Это должно сделать это...
Вы можете использовать автоинструмент для выбора интерпретатора Python 2. Вот как это сделать. Гарантировать правильный шебанг может быть сложно сделать элегантно; Вот один из способов сделать это. Может быть проще иметь простой скрипт-оболочку Bash, wrapper.sh.in
это выглядит примерно так:
#!/bin/bash
PYTHON2="@PYTHON@" #That first link enables this autotool variable
"$PYTHON2" "$@" #Call the desired Python 2 script with its arguments
Вызов wrapper.sh
(после ./configure
) лайк:
./wrapper.sh my_python2_script.py --an_option an_argument
Я считаю, что это будет делать то, что вы хотите, а именно, тестировать для неспецифической версии Python менее 3.x (при условии, что он не содержит from __future__ import print_function
заявление).
try:
py3 = eval('print')
except SyntaxError:
py3 = False
if py3: exit('requires Python 2')
...
Это работает путем тестирования, чтобы увидеть, если print
это встроенная функция, а не оператор, как в Python3. Когда это не функция, eval()
Функция вызовет исключение, означающее, что код выполняется на интерпретаторе до Python 3.0 с оговоркой, упомянутой выше.