Есть ли стандартный способ убедиться, что скрипт python будет интерпретироваться python2, а не python3? - PullRequest
21 голосов
/ 27 августа 2010

Есть ли стандартный способ убедиться, что скрипт python будет интерпретироваться python2, а не python3?В моем дистрибутиве я могу использовать #! / Usr / bin / env python2 в качестве shebang, но, похоже, не все дистрибутивы поставляются "python2".Я мог бы явно назвать конкретную версию (например, 2.6) Python, но это исключило бы людей, у которых нет этой версии.

Мне кажется, что это будет все более и более проблемой, когда дистрибутивыначнет ставить python3 в качестве интерпретатора Python по умолчанию.

Ответы [ 8 ]

11 голосов
/ 27 августа 2010

http://docs.python.org/library/sys.html#sys.version_info

С помощью модуля sys вы можете определить версию Python, которая работает, и вызвать исключение или выйти или что угодно.

UPDATE:

Вы можете использовать это для вызова соответствующего переводчика. Например, установите небольшой скрипт, который выполняет проверку за вас, и используйте его в shbang. Он проверит работающую версию Python и, если не то, что вы хотите, ищет ту, которую вы хотите. Затем он будет запускать скрипт в этой версии python (или завершится неудачей, если ничего хорошего не будет найдено).

7 голосов
/ 28 августа 2010

Это немного беспорядочная проблема в течение очень длительного периода времени перехода.К сожалению, не существует надежного, кроссплатформенного способа гарантировать, какая версия Python вызывается, кроме как проверять сам скрипт Python после запуска.Многие, если не большинство, дистрибутивы, которые поставляют Python 3, гарантируют, что общая команда python имеет псевдоним по умолчанию для самой последней версии Python 2, в то время как python3 псевдоним для самой последней версии Python 3. Те дистрибутивы, которые неРекомендуется сделать это.Но нет гарантии, что пользователь не отменит это.Я думаю, что наилучшая практика, доступная в обозримом будущем, заключается в том, чтобы упаковщики, распространители и пользователи предполагали, что python относится к Python 2 и, при необходимости, встраивает проверку выполнения во время выполнения сценария.

7 голосов
/ 27 августа 2010

Используя 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!")
2 голосов
/ 28 августа 2010

Зависит от того, как вы его распространяете, я думаю.

Если вы используете обычный файл setup.py для управления вашим дистрибутивом, запустите его, если пользователь пытается установить его вPython 3.

После установки сценарий консольного скрипта, созданного, скажем, setuptools, вероятно, будет связан с конкретным интерпретатором, который использовался для его установки.

Если вы что-то делаетеСтранно для вашей установки, вы можете в любом инсталляционном скрипте, который вы используете, искать интерпретаторы Python и сохранять выбор.Сначала вы можете проверить, является ли то, что называется «питоном», 2.x.Если нет, проверьте «python2.7», «python2.6» и т. Д., Чтобы увидеть, что доступно.

2 голосов
/ 28 августа 2010

Не совсем та же ситуация, но у компании, в которой я работаю, есть приложение, которое может запускать скрипты Python (среди многих его функций). После многочисленных проблем поддержки, связанных с установкой Python на различных платформах, мы решили просто установить наш собственный интерпретатор Python вместе с приложением. Таким образом, мы точно знаем, где он установлен и в какой версии. Этот подход может быть слишком тяжелым для ваших нужд (пакет Python составляет всего около 10% от нашего приложения), но он определенно работает.

0 голосов
/ 04 октября 2013

Вы можете использовать автоинструмент для выбора интерпретатора 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
0 голосов
/ 27 августа 2010

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

0 голосов
/ 27 августа 2010

Как я понимаю, разные дистрибутивы будут находиться в разных местах вашего диска. Вот некоторые предложения, которые приходят на ум -

  1. Вы можете использовать псевдоним UNIX для создания ярлыков, указывающих на разные дистрибутивы. Например: псевдоним py2 = "/ usr / bin / python2.X". Поэтому, когда вы запускаете свой скрипт, вы можете использовать py2 xx.py
  2. Иначе можно изменить переменную окружения PYTHON_PATH.
  3. Или, если я не ошибаюсь, в модуле sys есть положение для получения текущего номера версии Python. Вы можете получить это и иметь дело соответственно.

Это должно сделать это ...

...