Как я могу проверить версию Python в программе, которая использует новые возможности языка? - PullRequest
234 голосов
/ 15 января 2009

Если у меня есть сценарий Python, который требует по крайней мере определенного версия Python, как правильно грациозно провалиться когда для запуска скрипта используется более ранняя версия Python?

Как получить контроль достаточно рано, чтобы выдать сообщение об ошибке и выход?

Например, у меня есть программа, которая использует оператор ternery (новый в 2.5) и блоки with (новое в 2.6). Я написал простой маленький интерпретатор-версию рутина проверки, которая является первым, что скрипт позвони ... за исключением того, что это не так далеко. Вместо этого Сценарий завершается неудачно во время компиляции Python, прежде чем мои процедуры даже называются. Таким образом, пользователь сценария видит некоторые очень неясные трассировки ошибок Синакса - которые в значительной степени требуют эксперт, чтобы сделать вывод, что это просто случай бега неправильная версия Python.

Я знаю, как проверить версию Python. Проблема в том, что какой-то синтаксис недопустим в старых версиях Python. Рассмотрим эту программу:

import sys
if sys.version_info < (2, 4):
    raise "must use python 2.5 or greater"
else:
    # syntax error in 2.4, ok in 2.5
    x = 1 if True else 2
    print x

При запуске под 2.4, я хочу этот результат

$ ~/bin/python2.4 tern.py 
must use python 2.5 or greater

а не этот результат:

$ ~/bin/python2.4 tern.py 
  File "tern.py", line 5
    x = 1 if True else 2
           ^
SyntaxError: invalid syntax

(Ченнелинг для коллеги.)

Ответы [ 18 ]

107 голосов
/ 15 января 2009

Вы можете проверить, используя eval:

try:
  eval("1 if True else 2")
except SyntaxError:
  # doesn't have ternary

Также, with - это , доступный в Python 2.5, просто добавьте from __future__ import with_statement.

РЕДАКТИРОВАТЬ: чтобы получить контроль достаточно рано, вы можете разбить его на разные .py файлы и проверить совместимость в основном файле перед импортом (например, в __init__.py в пакете):

# __init__.py

# Check compatibility
try:
  eval("1 if True else 2")
except SyntaxError:
  raise ImportError("requires ternary support")

# import from another module
from impl import *
103 голосов
/ 15 января 2009

Оберните вокруг вашей программы оболочку, которая выполняет следующие действия.

import sys

req_version = (2,5)
cur_version = sys.version_info

if cur_version >= req_version:
   import myApp
   myApp.run()
else:
   print "Your Python interpreter is too old. Please consider upgrading."

Вы также можете рассмотреть возможность использования sys.version(), если вы планируете встретить людей, которые используют интерпретаторы Python до 2.0, но у вас есть несколько регулярных выражений.

И, возможно, есть более изящные способы сделать это.

31 голосов
/ 15 января 2009

Попробуйте

import platform
platform.python_version()

Должен дать вам строку типа "2.3.1". Если это не совсем то, что вам нужно, есть богатый набор данных, доступных через встроенную платформу. То, что вы хотите, должно быть где-то там.

22 голосов
/ 28 июня 2010

Вероятно, лучший способ сделать это сравнение версий - это использовать sys.hexversion. Это важно, потому что сравнение кортежей версий не даст желаемого результата во всех версиях Python.

import sys
if sys.hexversion < 0x02060000:
    print "yep!"
else:
    print "oops!"
15 голосов
/ 25 июня 2015
import sys    
# prints whether python is version 3 or not
python_version = sys.version_info.major
if python_version == 3:
    print("is python 3")
else:
    print("not python 3")
9 голосов
/ 16 ноября 2016

Ответ от Nykakin на AskUbuntu :

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

Есть две функции:

  • platform.python_version() (возвращает строку).
  • platform.python_version_tuple() (возвращает кортеж).

Код Python

Создайте файл, например: version.py)

Простой способ проверить версию:

import platform

print(platform.python_version())
print(platform.python_version_tuple())

Вы также можете использовать метод eval:

try:
  eval("1 if True else 2")
except SyntaxError:
  raise ImportError("requires ternary support")

Запустите файл Python из командной строки:

$ python version.py 
2.7.11
('2', '7', '11')

Вывод Python с CGI через сервер WAMP в Windows 10:

Screenshot 2016-11-16 14.39.01 by Suriyaa Kudo


Полезные ресурсы

7 голосов
/ 15 января 2009

Наборы стали частью основного языка в Python 2.4 для обеспечения обратной совместимости. Я сделал это тогда, что будет работать и для вас:

if sys.version_info < (2, 4):
    from sets import Set as set
7 голосов
/ 04 октября 2011

Хотя вопрос такой: Как получить контроль достаточно рано, чтобы выдать сообщение об ошибке и выйти ?

Вопрос, на который я отвечаю: Как получить контроль достаточно рано, чтобы выдать сообщение об ошибке перед запуском приложения ?

Я могу ответить на это совсем не так, как другие посты. Кажется, ответы до сих пор пытаются решить ваш вопрос из Python.

Я говорю, сделайте проверку версии перед запуском Python. Я вижу, ваш путь - Linux или Unix. Однако я могу предложить вам только сценарий Windows. Я представляю, что адаптировать его к синтаксису сценариев Linux не будет слишком сложно.

Вот сценарий DOS с версией 2.7:

@ECHO OFF
REM see http://ss64.com/nt/for_f.html
FOR /F "tokens=1,2" %%G IN ('"python.exe -V 2>&1"') DO ECHO %%H | find "2.7" > Nul
IF NOT ErrorLevel 1 GOTO Python27
ECHO must use python2.7 or greater
GOTO EOF
:Python27
python.exe tern.py
GOTO EOF
:EOF

Это не запускает какую-либо часть вашего приложения и, следовательно, не вызовет исключение Python. Он не создает временный файл и не добавляет никаких переменных среды ОС. И это не заканчивает ваше приложение исключением из-за различных правил синтаксиса версий. Это на три менее возможных точки безопасности доступа.

Строка FOR /F является ключом.

FOR /F "tokens=1,2" %%G IN ('"python.exe -V 2>&1"') DO ECHO %%H | find "2.7" > Nul

Для нескольких версий Python проверьте URL: http://www.fpschultze.de/modules/smartfaq/faq.php?faqid=17

И мой взломанный вариант:

[MS script; Проверка версии Python перед запуском модуля Python] http://pastebin.com/aAuJ91FQ

3 голосов
/ 24 мая 2017
import sys
sys.version

будет получать такой ответ

'2.7.6 (по умолчанию, 26 октября 2016 г., 20:30:19) \ n [GCC 4.8.4]'

здесь 2.7.6 - версия

2 голосов
/ 23 октября 2015

Поместите следующее в самый верх вашего файла:

import sys

if float(sys.version.split()[0][:3]) < 2.7:
    print "Python 2.7 or higher required to run this code, " + sys.version.split()[0] + " detected, exiting."
    exit(1)

Затем продолжите с нормальным кодом Python:

import ...
import ...
other code...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...