2012-01-31 3 views
104

У меня есть файл Python, который, возможно, должен поддерживать версии Python < 3.x и> = 3.x. Есть ли способ интроспектировать среду выполнения Python, чтобы узнать версию, на которой он запущен (например, 2.6 or 3.2.x)?Определить версию Python во время выполнения

+2

возможно дубликат [Как я могу проверить, какая версия Python работает мой сценарий?] (http://stackoverflow.com/questions/1093322/how-do-i-check-what-version -of-python-is-running-my-script) – drammock

ответ

164

Несомненно, посмотрите на sys.version и sys.version_info.

Например, чтобы проверить, что вы работаете в Python 3.x, используйте

import sys 
if sys.version_info[0] < 3: 
    raise "Must be using Python 3" 

Здесь sys.version_info[0] является основной номер версии. sys.version_info[1] предоставит вам младший номер версии.

В Python 2.7 и более поздних версиях также можно получить доступ к компонентам sys.version_info, поэтому основной номер версии: sys.version_info.major.

Смотрите также How can I check for Python version in a program that uses new language features?

+8

использовать 'raise Exception (« Должен использовать Python 3 »)', чтобы избежать ошибки. См. [Http: // stackoverflow.ком/вопросы/11497234/typeerrorexceptions-должно-быть-старый стиль-классы или производные-от-baseexception-нет] (http://stackoverflow.com/questions/11497234/typeerrorexceptions-must-be-old-style -classes-or-born-from-baseexception-no) – user906489

6

Per sys.hexversion и API and ABI Versioning:

import sys 
if sys.hexversion >= 0x3000000: 
    print('Python 3.x hexversion %s is in use.' % hex(sys.hexversion)) 
+0

Поскольку это позволяет тестировать как основные, так и младшие версии в одном простом и легко читаемом тесте, я думаю, что это лучший ответ. – John1024

2

Вот код, я использую с sys.version_info проверить установку Python:

def checkInstallation(rv): 
    currentVersion = sys.version_info 
    if currentVersion[0] == rv[0] and currentVersion[1] >= rv[1]: 
     pass 
    else: 
     sys.stderr.write("[%s] - Error: Your Python interpreter must be %d.%d or greater (within major version %d)\n" % (sys.argv[0], rv[0], rv[1], rv[0])) 
     sys.exit(-1) 
    return 0 

... 

# Calling the 'checkInstallation' function checks if Python is >= 2.7 and < 3 
requiredVersion = (2,7) 
checkInstallation(requiredVersion) 
0

сделать скрипты совместимы с python2 и 3 i использовать:

from sys import version_info 
if version_info[0] < 3: 
    from __future__ import print_function 
+5

Это необязательно, просто добавьте 'from__future__ import print_function' без проверки версии. Импорт ничего не делает в Python 3. –

16

Попробуйте этот код, это должно работать:

import platform 
print(platform.python_version()) 
+0

FYI это работает, но функция 'python_version' возвращает строку (например, в моей системе она печатает' '3.6.1''). Если вы проверяете версию в выражении 'if', таком как OP, ответ Криса имеет гораздо больший смысл, так как вам не нужно проходить неуклюжий процесс поиска строки для нужной информации. Этот ответ - это путь, если вы хотите зарегистрировать или отобразить версию для чтения человеком. – NauticalMile

+0

@NauticalMile Ответ Криса также возвращает строку, он просто индексирует в первый символ, чтобы увидеть, является ли это «3» или нет; то же самое будет работать здесь. – weberc2

+0

Hoe это решает проблему лучше, если вообще нет? Использование sys.version_info [0] или просто sys.version [0] уже достаточно ... – Apostolos

5

Лучшее решение зависит от того, сколько коды несовместимо. Если есть много мест для поддержки Python 2 и 3, six - это модуль совместимости. six.PY2 и six.PY3 - это два булина, если вы хотите проверить версию.

Однако лучшее решение, чем использование множества заявлений if, заключается в использовании функций совместимости six, если это возможно. Гипотетически, если Python 3000 имеет новый синтаксис для next, кто-то может обновить six, чтобы ваш старый код все равно работал.

import six 

#OK 
if six.PY2: 
    x = it.next() # Python 2 syntax 
else: 
    x = next(it) # Python 3 syntax 

#Better 
x = six.next(it) 

http://pythonhosted.org/six/

Приветствия

0

проверка версии ниже пример.

Обратите внимание, что я не остановить выполнение, этот фрагмент просто:
- ничего не делать, если точная версия соответствует
- запись информации, если ревизия (последний номер) отличается
- писать WARN, если какие-либо из крупного + минора является разные

import warnings 

def checkVersion(): 
    # Checking Python version: 
    expect_major = 2 
    expect_minor = 7 
    expect_rev = 14 
    if sys.version_info[:3] != (expect_major, expect_minor, expect_rev): 
     print("INFO: Script developed and tested with Python " + str(expect_major) + "." + str(expect_minor) + "." + str(expect_rev)) 
     current_version = str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2]) 
     if sys.version_info[:2] != (expect_major, expect_minor): 
      warnings.warn("Current Python version was unexpected: Python " + current_version) 
     else: 
      print("  Current version is different: Python " + current_version) 
Смежные вопросы