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

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

17 ответов


эта информация доступна в разделе sys.версия строка 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)

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


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

python -V

это задокументировано в 'MAN python'.


мне нравится sys.hexversion для таких вещей.

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

>>> import sys
>>> sys.hexversion
33883376
>>> '%x' % sys.hexversion
'20504f0'
>>> sys.hexversion < 0x02060000
True

ваш лучший выбор, вероятно, что-то вроде так:

>>> 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!"
>>>

использовать platform ' s python_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, чем цель, могут даже не загружать скрипт, поэтому не будет достаточно далеко, чтобы сообщить об этой ошибке. В качестве обходного пути вы можете запустить вышеизложенное в скрипте, который импортирует скрипт с более современным кодом.


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

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)

самый простой способ

просто введите 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.
>>> 

import sys
sys.version.split(' ')[0]

sys.версия дает вам то, что вы хотите, просто выберите первый номер :)


как сказал Сет, основной скрипт может проверить 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

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

import six

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

проверьте версию Python:python -V или python --version или apt-cache policy python

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


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

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

и

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


несколько ответов уже подсказали, как запрос текущая версия 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")

Если вы работаете в linux, просто дайте команду python выход будет такой

Python 2.4.3 (#1, Июнь 11 2009, 14:09:37)

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

введите "справка", "авторское право", "кредиты" или "лицензия" для более информация.


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.