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

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

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

21
задан static_rtti 27 August 2010 в 17:38
поделиться

5 ответов

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

7
ответ дан 29 November 2019 в 21:31
поделиться

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

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

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

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

2
ответ дан 29 November 2019 в 21:31
поделиться

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

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

ОБНОВЛЕНИЕ:

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

11
ответ дан 29 November 2019 в 21:31
поделиться

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

-1
ответ дан 29 November 2019 в 21:31
поделиться

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

2
ответ дан 29 November 2019 в 21:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: