Вопрос по python, version – Как проверить, какая версия Python использует мой скрипт?

968

Как я могу проверить, какая версия интерпретатора Python интерпретирует мой скрипт?

Текущий поток о проверке версии Python из программы / скрипта Python. Если вы хотите проверить версию интерпретатора Python, установленного на вашем компьютере, из командной строки, пожалуйста, обратитесь к следующему сообщению -Which version of Python do I have installed? RBT

Ваш Ответ

18   ответов
2

query текущая версия Python. кcheck программно требования к версии, я использую один из следующих двух методов:

# 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")
1166

Эта информация доступна вsys.version строка всистемный модуль:

>>> 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)

Это сравнивает основные и второстепенные версии информации. Добавить микро (=0, 1и т. д.) и даже уровень выпуска (='alpha','final'и т. д.) в кортеж, как вам нравится. Однако обратите внимание, что почти всегда лучше «утки» проверьте, есть ли определенная функция, и если нет, обойти (или выручить). Иногда функции уходят в новых версиях, заменяя их другими.

@ Арбитр Как это меняется?
Вы также можете получить доступ к некоторым полям вsys.version_info как свойства, такPY3 = sys.version_info.major == 3 может быть немного более привлекательным.
Мне нравится, что синтаксис, определяющий, какую версию вы используете, меняется в зависимости от того, какую версию вы используете.
PY2 = sys.version_info [0] == 2 PY3 = sys.version_info [0] == 3
фактически это синтаксис для печати. не для проверки версии. Я использую это в моих скриптах Python 2 и 3:PY3 = sys.version_info[0] == 3
1

sys.version_info кажется, не возвращаетtuple по состоянию на 3.7. Скорее, он возвращает специальный класс, поэтому все примеры, использующие кортежи, не работают, по крайней мере, для меня. Вот вывод с консоли Python:

>>> import sys
>>> type(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.

3

python -V или жеpython --version или жеapt-cache policy python

Вы также можете запуститьwhereis python чтобы увидеть, сколько версий установлено.

Тот же ответ уже был опубликован. и, вопрос не в том, «Как проверить, какую версию Python я установил?» но & quot; Как проверить версию в моем скрипте & quot ;.
2

ретатора Python (чтобы избежать исключений синтаксиса версии Python), см. Решение:

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

а также

Скрипт MS; Проверка версии Python перед запуском модуля Python http://pastebin.com/aAuJ91FQ (Скорее всего, скрипт легко конвертировать в другие скрипты ОС.)

0
If you want to detect pre-Python 3 and don't want to import anything...

делать это вsingle expression:

is_python_3_or_above = (lambda x: [x for x in [False]] and None or x)(True)
-1

python  вывод будет таким

Python 2.4.3 (#1, Jun 11 2009, 14:09:37)

[GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] on linux2

Type "help", "copyright", "credits" or "license" for more information.

Не помогает получитьPython версия внутри скрипта, также аналогичный ответ уже выложен ранее:stackoverflow.com/a/35294211/950762
Я хочу, чтобы мой скрипт на python мог получить версию python, которая его интерпретирует. Правильный ответ принят. carrier
6
The simplest way

 как следует

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.
>>> 
"The simplest way" ... сделать что-то другое, чем то, что просили.
7

six модуль, вы можете сделать это:

import six

if six.PY2:
  # this is python2.x
else:
  # six.PY3
  # this is python3.x
50

platform's python_version из stdlib:

>>> from platform import python_version
>>> print(python_version())
2.7.8
Для функции печати было бы лучше в скобках подумать о совместимости. Если кто-то использует образец в версии 3, синтаксическая ошибка будет там в ожидании.
21

которая сразу выходит (удобно для сценариев и автоматического выполнения):

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)
спасибо, теперь он работает как для 2, так и для 3 версий
@vigilancer Вы правы, на момент написания статьи это еще не было актуально, но я обновил его для Python 3 сейчас :)
не работает для python3
46

#!/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, Они умрут во время "lexing" фаза, и никогда не будет возможности на самом делеexecute exit(1). Seth's answer правильно инкапсулировать новые языковые функции в другие файлы.
Я думаю, что @MarkRushakoff говорит, что если у вас есть это в начале файла, и новая языковая функция в другом месте того же файла, старая версия python умрет при загрузке файла, прежде чем он запустит какой-либо из них, поэтому ошибка не будет отображена. По сути, вы должны поместить вышеупомянутую (или другую проверку) в начало файла, а затем импортировать код, для которого требуется новая версия python, из отдельных файлов.
Да, что @rjmunro сказал :)
@MarkRushakoff: ваш комментарий сбивает с толку. Какой аспект этого ответа не так? Пропажаelse филиал или что< используется дляversion_info? AFAIK Python дополняет пропущенные значения в кортежах, и все это должно быть допустимо до 2.6, нет? Поэтому в ответе Сета используется нарезка (избыточно), а в этом нет, и это делает ваш комментарий еще более запутанным.
4
import sys
sys.version.split(' ')[0]

)

sys.version_info это уже кортеж
62

>>> 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!"
>>>
Почему простое исключение, а не ошибка ImportError? :П
except Exception слишком широк. Не лучше ли использовать определенные исключения, которые вы ожидаете?
@deadly - ImportError не перехватит SyntaxErrors, которые будут выброшены, если вы попытаетесь использовать новый синтаксис в старом питоне, например, попытаться использоватьshortcut conditional в до-2.5.
@Fermiparadox - Широкий выбор делает предположения низкими.except Exception: Линия сама по себе уже предполагает современный (2.x +) питон. Может быть, какой-нибудь будущий питон переставит имена исключений каким-то образом, несовместимым с прошлым? (Вероятно, нет, но кто знает, как будет выглядеть питон через 20 лет, когда у всех нас есть имплантаты глазного яблока с рифтом? Код длится долго.)
5

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
93

sys.hexversion за такие вещи, как это.

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

>>> import sys
>>> sys.hexversion
33883376
>>> '%x' % sys.hexversion
'20504f0'
>>> sys.hexversion < 0x02060000
True
Это отличная функция версии, которую я не видел, и немного проще в использовании (по крайней мере, для меня), чем обычная версия ...
@sorin: хм, это не имеет значения, не так ли? Если я сравниваю с(2,6,4) 'final' кажется, не влияет на сравнение, и это не должно. Очевидно, что при сравнении «наиболее значимых» нарезка не требуется. части кортежа. Похоже, это то, как к этому относились и о чем мой вопрос. Я не говорю, что это решение не имеет своих достоинств, я просто задаюсь вопросом, почему оно лучшее - то есть то, что мне не хватает.
@sorin: можете ли вы объяснить, как это лучше, чем, например, ответ Сета? Поскольку вы заявляете, что это лучшее, мне интересно.
Уровень высвобождения определен как один из «альфа», «бета», «кандидат» или «окончательный»; что тоже бывает правильно сравнивать ...
@ 0xC0000022L Задумывались ли вы, как вы сможете сравнить текст из кортежа? Как «окончательный»? сравнивается с бета, rc или с чем бы то ни было. Вместо этого, если у вас есть числовое значение, вы всегда сможете указать точную версию.
308

Из командной строки (обратите внимание на заглавную V):

python -V

Это задокументировано в «man python».

@ Перевозчик Я не понимаю, какая разница должна быть.
Разница в том, что вам нужно проверитьwhile you are running the script так что вы можете реагировать соответственно; например, если вы работаете в среде, где версия Python не находится под вашим контролем.
Вопрос не в том, «Как проверить, какую версию Python я установил?» Многие другие ответы верны. carrier
Python -v не является подробной версией .... это задокументировано в Python -h
заглавная V - версия, не строчная
1

вот способ сделать это на 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")

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