Как я могу проверить, какая версия интерпретатора Python интерпретирует мой скрипт?
python_version = int(str(range(3))[-2])
Как я могу проверить, какая версия интерпретатора Python интерпретирует мой скрипт?
python_version = int(str(range(3))[-2])
Ответы:
Эта информация доступна в строке sys.version в модуле sys :
>>> import sys
Человек читаемый:
>>> print(sys.version) # parentheses necessary in python 3.
2.5.2 (r252:60911, Jul 31 2008, 17:28:52)
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)]
Для дальнейшей обработки:
>>> sys.version_info
(2, 5, 2, 'final', 0)
# or
>>> sys.hexversion
34014192
Чтобы скрипт работал с минимальными требованиями к версии интерпретатора Python, добавьте его в свой код:
assert sys.version_info >= (2, 5)
Это сравнивает основные и второстепенные версии информации. Добавьте 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,)
. Сравнивать кортежи разного размера - это совершенно питонно, и все будет правильно.
Мне нравится такие sys.hexversion
вещи, как это.
http://docs.python.org/library/sys.html#sys.hexversion
>>> import sys
>>> sys.hexversion
33883376
>>> '%x' % sys.hexversion
'20504f0'
>>> sys.hexversion < 0x02060000
True
(2,6,4)
'final'
Ваша лучшая ставка, вероятно, примерно такая:
>>> import sys
>>> sys.version_info
(2, 6, 4, 'final', 0)
>>> if not 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
... except Exception:
... print "can't import, probably because your python is too old!"
>>>
except Exception
слишком широк. Не лучше ли использовать конкретные исключения, которые вы ожидаете?
except Exception:
Линия сама по себе уже предполагает современную (2.x +) питон. Может быть, какой-нибудь будущий питон переставит имена исключений каким-то образом, несовместимым с прошлым? (? Наверное , нет, но кто знает , что питон будет выглядеть в 20 лет , когда все мы имеем Oculus имплантаты разлом глазного яблока код длится долгое время.)
Используйте platform
spython_version
из stdlib:
>>> from platform import python_version
>>> print(python_version())
2.7.8
Положите что-то вроде:
#!/usr/bin/env/python
import 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)
. Ответ Сета верен в инкапсуляции новых возможностей языка в других файлах.
else
ветка или что за <
используется version_info
? AFAIK Python дополняет пропущенные значения в кортежах, и все это должно быть допустимо до 2.6, нет? Так что ответ Сета использует нарезку (избыточно), а этот - нет, и это делает ваш комментарий еще более запутанным.
Вот короткая версия командной строки, которая выходит сразу (удобно для сценариев и автоматического выполнения):
python -c "print(__import__('sys').version)"
Или только мажор, минор и микро
python -c "print(__import__('sys').version_info[:1])" # (2,)
python -c "print(__import__('sys').version_info[:2])" # (2, 7)
python -c "print(__import__('sys').version_info[:3])" # (2, 7, 6)
python2 --version
и python3 --version
из PHP. В то время как я получал бы последний без проблем через него passthru()
, первый печатал только на экран, но никогда не
print()
чтобы записать в файл, если это более удобно.
passthru()
вывод в файл. Ваше решение делает именно то, что мне нужно. :)
Как сказал Сет, основной сценарий может проверить sys.version_info
(но учтите, что он появился только до 2.0, поэтому, если вы хотите поддерживать более старые версии, вам нужно проверить другое свойство версии модуля sys).
Но вам все равно нужно позаботиться о том, чтобы в файле не использовались какие-либо функции языка Python, которые недоступны в более старых версиях Python. Например, это разрешено в Python 2.5 и более поздних версиях:
try:
pass
except:
pass
finally:
pass
но не будет работать в более старых версиях Python, потому что вы можете иметь только, кроме ИЛИ, наконец, сопоставить попытку. Поэтому для совместимости со старыми версиями Python вам нужно написать:
try:
try:
pass
except:
pass
finally:
pass
Просто введите Python в свой терминал, и вы можете увидеть версию, как показано ниже
desktop:~$ python
Python 2.7.6 (default, Jun 22 2015, 18:00:18)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
Несколько ответов уже предлагают, как запросить текущую версию Python. Чтобы программно проверить требования к версии, я бы использовал один из следующих двух методов:
# Method 1: (see krawyoti's answer)
import sys
assert(sys.version_info >= (2,6))
# Method 2:
import platform
from distutils.version import StrictVersion
assert(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 = 0
try:
import platform
except (ImportError, NameError):
# We have no platform module - try to get the info via the sys module
check_sys = 1
if not check_sys:
if hasattr(platform, "python_version"):
via_platform = 1
else:
check_sys = 1
if check_sys:
try:
import sys
test_sys = 1
except (ImportError, NameError):
# just let via_sys_version_info and via_sys_version remain False - we have no sys module
pass
if test_sys:
if hasattr(sys, "version_info"):
via_sys_version_info = 1
elif hasattr(sys, "version"):
via_sys_version = 1
else:
# just let via_sys remain False
pass
if 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")
... вы можете (ab) использовать изменения области видимости списка и сделать это в одном выражении :
is_python_3_or_above = (lambda x: [x for x in [False]] and None or x)(True)
from sys import version_info, api_version, version, hexversion
print(f"sys.version: {version}")
print(f"sys.api_version: {api_version}")
print(f"sys.version_info: {version_info}")
print(f"sys.hexversion: {hexversion}")
вывод
sys.version: 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] sys.api_version: 1013 sys.version_info: sys.version_info(major=3, minor=6, micro=5, releaselevel='final', serial=0) sys.hexversion: 50726384
print("sys.version: {}".format(version))
.
Проверьте версию Python: python -V
или python --version
илиapt-cache policy python
Вы также можете запустить, whereis python
чтобы увидеть, сколько версий установлено.
sys.version_info
не возвращает tuple
3,7. Скорее, он возвращает специальный класс, поэтому все примеры, использующие кортежи, не работают, по крайней мере, для меня. Вот вывод из консоли Python:
>>> import sys
>>> type(sys.version_info)
<class 'sys.version_info'>
Я обнаружил, что с помощью комбинации sys.version_info.major
и, sys.version_info.minor
кажется, достаточно. Например,...
import sys
if sys.version_info.major > 3:
print('Upgrade to Python 3')
exit(1)
проверяет, работает ли Python 3. Вы даже можете проверить более конкретные версии с ...
import sys
ver = sys.version_info
if ver.major > 2:
if ver.major == 3 and ver.minor <= 4:
print('Upgrade to Python 3.5')
exit(1)
можете проверить, если вы используете хотя бы Python 3.5.
namedtuple
и сравнение с кортежем определенно работает. Чтобы получить полное равенство, вам нужен тип из пяти элементов: главный, младший, микро, уровень выпуска (строка) и серийный номер.
Чтобы проверить версию Python для команд в Windows, выполните следующие команды в командной строке и проверьте вывод
c:\>python -V
Python 2.7.16
c:\>py -2 -V
Python 2.7.16
c:\>py -3 -V
Python 3.7.3
Также, чтобы увидеть конфигурацию папки для каждой версии Python, выполните следующие команды:
For Python 2,'py -2 -m site'
For Python 3,'py -3 -m site'
Если вы работаете над Linux, просто введите python
вывод команды так:
Python 2.4.3 (# 1, 11 июня 2009, 14:09:37)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] на linux2
Введите «помощь», «авторское право», «кредиты» или «лицензия» для получения дополнительной информации.
Python
версию в скрипте, также похожий ответ, уже опубликованный ранее: stackoverflow.com/a/35294211/950762
Чтобы проверить из командной строки, в одной единственной команде, но включить главную, вспомогательную, микро-версию, уровень выпуска и серийный номер , затем вызовите тот же интерпретатор Python (т. Е. Тот же путь), который вы используете для своего сценария:
> path/to/your/python -c "import sys; print('{}.{}.{}-{}-{}'.format(*sys.version_info))"
3.7.6-final-0
Примечание: .format()
вместо f-строк или '.'.join()
позволяет вам использовать произвольное форматирование и разделительные символы, например, чтобы сделать это строкой из одного слова с возможностью распознавания. Я поместил это в служебный скрипт bash, который сообщает обо всех важных версиях: python, numpy, pandas, sklearn, MacOS, xcode, clang, brew, conda, anaconda, gcc / g ++ и т. Д. Полезно для регистрации, репликации, устранения неполадок, отчетов об ошибках и т. Д. ,
python
команда вызовет этот конкретный интерпретатор Python.