Подтвердить что ты не робот

Есть ли стандартный способ убедиться, что python script будет интерпретироваться python2, а не python3?

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

UPDATE:

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

Ответ 3

Используя 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!")

Ответ 4

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

Ответ 5

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

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

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

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

Ответ 6

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

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

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

Ответ 7

Вы можете использовать autotools для выбора интерпретатора Python 2. Здесь, как это сделать. Гарантировать правильную shebang может быть сложно сделать элегантно; здесь - это один из способов сделать это. Может быть проще просто иметь легкую Bash обертку script, wrapper.sh.in, которая выглядит примерно так:

#!/bin/bash
PYTHON2="@[email protected]" #That first link enables this autotool variable
"$PYTHON2" "[email protected]"  #Call the desired Python 2 script with its arguments

Вызов wrapper.sh (после a ./configure), например:

./wrapper.sh my_python2_script.py --an_option an_argument

Ответ 8

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