Текущий поток о проверке версии Python из программы / скрипта Python. Если вы хотите проверить версию интерпретатора Python, установленного на вашем компьютере, из командной строки, пожалуйста, обратитесь к следующему сообщению - Какую версию Python я установил?
RBT
1
вот забавный способ разделить Python 3 и 2 ...python_version = int(str(range(3))[-2])
Chris_Rands
@RBT: для проверки в одну строку из командной строки, смотрите мой ответ .
СМСИ
Ответы:
1380
Эта информация доступна в строке sys.version в модуле sys :
>>>import sys
Человек читаемый:
>>>print(sys.version)# parentheses necessary in python 3. 2.5.2(r252:60911,Jul312008,17:28:52)[GCC 4.2.3(Ubuntu4.2.3-2ubuntu7)]
Чтобы скрипт работал с минимальными требованиями к версии интерпретатора Python, добавьте его в свой код:
assert sys.version_info >=(2,5)
Это сравнивает основные и второстепенные версии информации. Добавьте micro (= 0, 1и т. Д.) И даже уровень выпуска (= 'alpha', 'final'и т. Д.) В кортеж, как вам нравится. Тем не менее, обратите внимание, что почти всегда лучше проверять наличие определенной функции и, если нет, обходной путь (или выход из кризиса). Иногда функции уходят в новых версиях, заменяя их другими.
Вы также можете получить доступ к некоторым полям в sys.version_infoкачестве свойств, поэтому они PY3 = sys.version_info.major == 3могут быть немного более привлекательными.
@gcb ваш фрагмент кода будет ломаться всякий раз, когда появится Python 4. Вы должны сделать if sys.version_info >= (3,). Сравнивать кортежи разного размера - это совершенно питонно, и все будет правильно.
Борис
373
Из командной строки (обратите внимание на заглавную букву 'V'):
Это отличная версия, которую я не видел, и немного проще в использовании (по крайней мере, для меня), чем обычная версия ...
Уэйн Вернер
6
@sorin: можете ли вы объяснить, как это лучше, чем, например, ответ Сета? Так как вы утверждаете, что это лучшее, мне интересно.
0xC0000022L
3
@ 0xC0000022L Задумывались ли вы, как вы сможете сравнить текст из кортежа? Как «финал» сравнивается с бета, rc или чем-то еще, что может быть там. Вместо этого, если у вас есть числовое значение, вы всегда сможете указать точную версию.
сорин
1
@sorin: хм, это не имеет значения, не так ли? Если сравнивать с , кажется , не влияет на сравнение и не предполагается. Очевидно, что при сравнении «наиболее значимых» частей кортежа нарезка не требуется. Похоже, это то, как к этому относятся, и вот о чем был мой вопрос. Я не говорю, что это решение не имеет смысла, я просто удивляюсь, почему оно лучшее - то, что мне не хватает. (2,6,4)'final'
0xC0000022L
11
Уровень релиза определяется как «альфа», «бета», «кандидат» или «финал», который также сравнивается корректно ...
Фредрик
65
Ваша лучшая ставка, вероятно, примерно такая:
>>>import sys
>>> sys.version_info
(2,6,4,'final',0)>>>ifnot sys.version_info[:2]==(2,6):...print"Error, I need python 2.6"...else:...from my_module import twoPointSixCode
>>>
Кроме того, вы всегда можете заключить импорт в простую попытку, которая должна отлавливать синтаксические ошибки. И, к слову @ Heikki, этот код будет совместим с гораздо более старыми версиями python:
>>>try:...from my_module import twoPointSixCode
...exceptException:...print"can't import, probably because your python is too old!">>>
Почему простое исключение, а не ошибка ImportError? : P
смертельно
4
@deadly - ImportError не будет перехватывать SyntaxErrors, которые будут выброшены, если вы попытаетесь использовать новый синтаксис в старом питоне, например, попытаться использовать условный ярлык в pre-2.5.
Сет
except Exceptionслишком широк. Не лучше ли использовать конкретные исключения, которые вы ожидаете?
Парадокс Ферми
1
@Fermiparadox - Широкий выбор делает предположения низкими. except Exception:Линия сама по себе уже предполагает современную (2.x +) питон. Может быть, какой-нибудь будущий питон переставит имена исключений каким-то образом, несовместимым с прошлым? (? Наверное , нет, но кто знает , что питон будет выглядеть в 20 лет , когда все мы имеем Oculus имплантаты разлом глазного яблока код длится долгое время.)
Для функции печати лучше было бы в скобках подумать о совместимости. Если кто-то использует образец в версии 3, синтаксическая ошибка будет там в ожидании.
Алекс Чан
47
Положите что-то вроде:
#!/usr/bin/env/pythonimport sys
if sys.version_info<(2,6,0):
sys.stderr.write("You need python 2.6 or later to run this script\n")
exit(1)
в верхней части вашего сценария.
Обратите внимание, что в зависимости от того, что еще есть в вашем скрипте, более старые версии python, чем целевая, могут даже не загружать скрипт, поэтому не зайдут достаточно далеко, чтобы сообщить об этой ошибке. В качестве обходного пути вы можете запустить вышеописанное в скрипте, который импортирует скрипт с более современным кодом.
Это неверно (или, по крайней мере, неполно), потому что старые интерпретаторы будут препятствовать использованию новых языковых конструкций, таких как x if Pred() else y. Они умрут во время фазы «лексинга», и у них никогда не будет шанса на самом деле казнитьexit(1) . Ответ Сета верен в инкапсуляции новых возможностей языка в других файлах.
Марк Рушаков
2
@MarkRushakoff: ваш комментарий сбивает с толку. Какой аспект этого ответа не так? Отсутствующая elseветка или что за <используется version_info? AFAIK Python дополняет пропущенные значения в кортежах, и все это должно быть допустимо до 2.6, нет? Так что ответ Сета использует нарезку (избыточно), а этот - нет, и это делает ваш комментарий еще более запутанным.
0xC0000022L
5
Я думаю, что @MarkRushakoff говорит, что если у вас есть это в верхней части файла, и новая языковая функция в другом месте того же файла, старая версия python умрет при загрузке файла, прежде чем он запустит какой-либо из них, поэтому ошибка не будет отображаться. По сути, вы должны поместить вышеупомянутую (или другую проверку) в начало файла, а затем импортировать код, для которого требуется новая версия python, из отдельных файлов.
rjmunro
1
Да, что сказал @rjmunro :)
Марк Рушаков
24
Вот короткая версия командной строки, которая выходит сразу (удобно для сценариев и автоматического выполнения):
@vigilancer вы правы, на момент написания статьи это еще не было актуально, но я обновил его для Python 3 :)
Wolph
Хорошо, это решает мою проблему, когда я получал номер версии, захватив выходные данные python2 --versionи python3 --versionиз PHP. В то время как я получал бы последний без проблем через него passthru(), первый печатал только на экран, но никогда не
Tox
1
@tox Вы можете сказать, print() чтобы записать в файл, если это более удобно.
Вольф
В моем случае это было бы больше того же, что я уже перенаправил passthru()вывод в файл. Ваше решение делает именно то, что мне нужно. :)
Токс
14
С sixмодулем вы можете сделать это:
import six
if six.PY2:# this is python2.xelse:# six.PY3# this is python3.x
Как сказал Сет, основной сценарий может проверить sys.version_info (но учтите, что он появился только до 2.0, поэтому, если вы хотите поддерживать более старые версии, вам нужно проверить другое свойство версии модуля sys).
Но вам все равно нужно позаботиться о том, чтобы в файле не использовались какие-либо функции языка Python, которые недоступны в более старых версиях Python. Например, это разрешено в Python 2.5 и более поздних версиях:
try:passexcept:passfinally:pass
но не будет работать в более старых версиях Python, потому что вы можете иметь только, кроме ИЛИ, наконец, сопоставить попытку. Поэтому для совместимости со старыми версиями Python вам нужно написать:
«Самый простой способ» ... сделать что-то отличное от того, о чем просили.
Люк
2
Несколько ответов уже предлагают, как запросить текущую версию Python. Чтобы программно проверить требования к версии, я бы использовал один из следующих двух методов:
# Method 1: (see krawyoti's answer)import sys
assert(sys.version_info >=(2,6))# Method 2: import platform
from distutils.version importStrictVersionassert(StrictVersion(platform.python_version())>="2.6")
Просто для удовольствия, вот способ сделать это на CPython 1.0-3.7b2, Pypy, Jython и Micropython. Это скорее любопытство, чем способ сделать это в современном коде. Я написал его как часть http://stromberg.dnsalias.org/~strombrg/pythons/ , которая является скриптом для тестирования фрагмента кода на многих версиях Python одновременно, так что вы можете легко понять, что такое Python какие функции совместимы с какими версиями python:
via_platform =0
check_sys =0
via_sys_version_info =0
via_sys_version =0
test_sys =0try:import platform
except(ImportError,NameError):# We have no platform module - try to get the info via the sys module
check_sys =1ifnot check_sys:if hasattr(platform,"python_version"):
via_platform =1else:
check_sys =1if check_sys:try:import sys
test_sys =1except(ImportError,NameError):# just let via_sys_version_info and via_sys_version remain False - we have no sys modulepassif test_sys:if hasattr(sys,"version_info"):
via_sys_version_info =1elif hasattr(sys,"version"):
via_sys_version =1else:# just let via_sys remain Falsepassif via_platform:# This gives pretty good info, but is not available in older interpreters. Also, micropython has a# platform module that does not really contain anything.print(platform.python_version())elif via_sys_version_info:# This is compatible with some older interpreters, but does not give quite as much info.print("%s.%s.%s"% sys.version_info[:3])elif via_sys_version:import string
# This is compatible with some older interpreters, but does not give quite as much info.
verbose_version = sys.version
version_list = string.split(verbose_version)print(version_list[0])else:print("unknown")
Тот же ответ уже был опубликован. и, вопрос не в том, «Как проверить, какую версию Python я установил?» но "Как мне проверить версию в моем скрипте".
Стэнли Коу
1
sys.version_infoне возвращает tuple3,7. Скорее, он возвращает специальный класс, поэтому все примеры, использующие кортежи, не работают, по крайней мере, для меня. Вот вывод из консоли Python:
Это что-то вроде подкласса, namedtupleи сравнение с кортежем определенно работает. Чтобы получить полное равенство, вам нужен тип из пяти элементов: главный, младший, микро, уровень выпуска (строка) и серийный номер.
Михаил Едошин
1
Чтобы проверить версию Python для команд в Windows, выполните следующие команды в командной строке и проверьте вывод
Чтобы проверить из командной строки, в одной единственной команде, но включить главную, вспомогательную, микро-версию, уровень выпуска и серийный номер , затем вызовите тот же интерпретатор Python (т. Е. Тот же путь), который вы используете для своего сценария:
Примечание: .format()вместо f-строк или '.'.join()позволяет вам использовать произвольное форматирование и разделительные символы, например, чтобы сделать это строкой из одного слова с возможностью распознавания. Я поместил это в служебный скрипт bash, который сообщает обо всех важных версиях: python, numpy, pandas, sklearn, MacOS, xcode, clang, brew, conda, anaconda, gcc / g ++ и т. Д. Полезно для регистрации, репликации, устранения неполадок, отчетов об ошибках и т. Д. ,
Этот ответ будет уместен для другого вопроса, такого как тот, который указан в комментариях к вопросу. Это не подходит для определения того, какая версия Python выполняет сценарий из этого сценария, поскольку нет гарантии, что pythonкоманда вызовет этот конкретный интерпретатор Python.
user2357112 поддерживает Monica
@ user2357112supportsMonica: этот ответ совершенно соответствует предложенному вопросу. Вопрос, как заявлено, нигде не говорит «изнутри сценария». Если бы это было так, это было бы иначе. Очевидно, что этот ответ подразумевает «вызов того же интерпретатора Python, т.е. того же пути, который вы использовали для своего сценария». Но если вы настаиваете, что я должен отредактировать это в ответ, я буду.
python_version = int(str(range(3))[-2])
Ответы:
Эта информация доступна в строке sys.version в модуле sys :
Человек читаемый:
Для дальнейшей обработки:
Чтобы скрипт работал с минимальными требованиями к версии интерпретатора Python, добавьте его в свой код:
Это сравнивает основные и второстепенные версии информации. Добавьте micro (=
0
,1
и т. Д.) И даже уровень выпуска (='alpha'
,'final'
и т. Д.) В кортеж, как вам нравится. Тем не менее, обратите внимание, что почти всегда лучше проверять наличие определенной функции и, если нет, обходной путь (или выход из кризиса). Иногда функции уходят в новых версиях, заменяя их другими.источник
PY3 = sys.version_info[0] == 3
sys.version_info
качестве свойств, поэтому ониPY3 = sys.version_info.major == 3
могут быть немного более привлекательными.if sys.version_info >= (3,)
. Сравнивать кортежи разного размера - это совершенно питонно, и все будет правильно.Из командной строки (обратите внимание на заглавную букву 'V'):
Это задокументировано в «man python».
источник
Мне нравится такие
sys.hexversion
вещи, как это.http://docs.python.org/library/sys.html#sys.hexversion
источник
(2,6,4)
'final'
Ваша лучшая ставка, вероятно, примерно такая:
Кроме того, вы всегда можете заключить импорт в простую попытку, которая должна отлавливать синтаксические ошибки. И, к слову @ Heikki, этот код будет совместим с гораздо более старыми версиями python:
источник
except Exception
слишком широк. Не лучше ли использовать конкретные исключения, которые вы ожидаете?except Exception:
Линия сама по себе уже предполагает современную (2.x +) питон. Может быть, какой-нибудь будущий питон переставит имена исключений каким-то образом, несовместимым с прошлым? (? Наверное , нет, но кто знает , что питон будет выглядеть в 20 лет , когда все мы имеем Oculus имплантаты разлом глазного яблока код длится долгое время.)Используйте
platform
spython_version
из stdlib:источник
Положите что-то вроде:
в верхней части вашего сценария.
Обратите внимание, что в зависимости от того, что еще есть в вашем скрипте, более старые версии python, чем целевая, могут даже не загружать скрипт, поэтому не зайдут достаточно далеко, чтобы сообщить об этой ошибке. В качестве обходного пути вы можете запустить вышеописанное в скрипте, который импортирует скрипт с более современным кодом.
источник
x if Pred() else y
. Они умрут во время фазы «лексинга», и у них никогда не будет шанса на самом деле казнитьexit(1)
. Ответ Сета верен в инкапсуляции новых возможностей языка в других файлах.else
ветка или что за<
используетсяversion_info
? AFAIK Python дополняет пропущенные значения в кортежах, и все это должно быть допустимо до 2.6, нет? Так что ответ Сета использует нарезку (избыточно), а этот - нет, и это делает ваш комментарий еще более запутанным.Вот короткая версия командной строки, которая выходит сразу (удобно для сценариев и автоматического выполнения):
Или только мажор, минор и микро
источник
python2 --version
иpython3 --version
из PHP. В то время как я получал бы последний без проблем через негоpassthru()
, первый печатал только на экран, но никогда неprint()
чтобы записать в файл, если это более удобно.passthru()
вывод в файл. Ваше решение делает именно то, что мне нужно. :)С
six
модулем вы можете сделать это:источник
sys.version дает вам то, что вы хотите, просто выберите первый номер :)
источник
Как сказал Сет, основной сценарий может проверить
sys.version_info
(но учтите, что он появился только до 2.0, поэтому, если вы хотите поддерживать более старые версии, вам нужно проверить другое свойство версии модуля sys).Но вам все равно нужно позаботиться о том, чтобы в файле не использовались какие-либо функции языка Python, которые недоступны в более старых версиях Python. Например, это разрешено в Python 2.5 и более поздних версиях:
но не будет работать в более старых версиях Python, потому что вы можете иметь только, кроме ИЛИ, наконец, сопоставить попытку. Поэтому для совместимости со старыми версиями Python вам нужно написать:
источник
Самый простой способ
Просто введите Python в свой терминал, и вы можете увидеть версию, как показано ниже
источник
Несколько ответов уже предлагают, как запросить текущую версию Python. Чтобы программно проверить требования к версии, я бы использовал один из следующих двух методов:
источник
Просто для удовольствия, вот способ сделать это на CPython 1.0-3.7b2, Pypy, Jython и Micropython. Это скорее любопытство, чем способ сделать это в современном коде. Я написал его как часть http://stromberg.dnsalias.org/~strombrg/pythons/ , которая является скриптом для тестирования фрагмента кода на многих версиях Python одновременно, так что вы можете легко понять, что такое Python какие функции совместимы с какими версиями python:
источник
Если вы хотите обнаружить pre-Python 3 и не хотите ничего импортировать ...
... вы можете (ab) использовать изменения области видимости списка и сделать это в одном выражении :
источник
вывод
источник
print("sys.version: {}".format(version))
.Проверьте версию Python:
python -V
илиpython --version
илиapt-cache policy python
Вы также можете запустить,
whereis python
чтобы увидеть, сколько версий установлено.источник
sys.version_info
не возвращаетtuple
3,7. Скорее, он возвращает специальный класс, поэтому все примеры, использующие кортежи, не работают, по крайней мере, для меня. Вот вывод из консоли Python:Я обнаружил, что с помощью комбинации
sys.version_info.major
и,sys.version_info.minor
кажется, достаточно. Например,...проверяет, работает ли Python 3. Вы даже можете проверить более конкретные версии с ...
можете проверить, если вы используете хотя бы Python 3.5.
источник
namedtuple
и сравнение с кортежем определенно работает. Чтобы получить полное равенство, вам нужен тип из пяти элементов: главный, младший, микро, уровень выпуска (строка) и серийный номер.Чтобы проверить версию Python для команд в Windows, выполните следующие команды в командной строке и проверьте вывод
Также, чтобы увидеть конфигурацию папки для каждой версии Python, выполните следующие команды:
источник
Если вы работаете над Linux, просто введите
python
вывод команды так:источник
Python
версию в скрипте, также похожий ответ, уже опубликованный ранее: stackoverflow.com/a/35294211/950762Еще более простой способ:
В Spyder запустите новую «Консоль IPython», затем запустите любой из существующих сценариев.
Теперь версию можно увидеть в первом выводе, напечатанном в окне консоли:
«Python 3.7.3 (по умолчанию, 24 апреля 2019, 15:29:51) ...»
источник
Чтобы проверить из командной строки, в одной единственной команде, но включить главную, вспомогательную, микро-версию, уровень выпуска и серийный номер , затем вызовите тот же интерпретатор Python (т. Е. Тот же путь), который вы используете для своего сценария:
Примечание:
.format()
вместо f-строк или'.'.join()
позволяет вам использовать произвольное форматирование и разделительные символы, например, чтобы сделать это строкой из одного слова с возможностью распознавания. Я поместил это в служебный скрипт bash, который сообщает обо всех важных версиях: python, numpy, pandas, sklearn, MacOS, xcode, clang, brew, conda, anaconda, gcc / g ++ и т. Д. Полезно для регистрации, репликации, устранения неполадок, отчетов об ошибках и т. Д. ,источник
python
команда вызовет этот конкретный интерпретатор Python.