Как определить версию Python во время выполнения?

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

9 ответов

Решение

Конечно, посмотрите на sys.version а также sys.version_info,

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

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

Вот, sys.version_info[0] основной номер версии. sys.version_info[1] даст вам младший номер версии.

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

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

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

import platform
print(platform.python_version())

В соответствии с sys.hexversion и версиями API и ABI:

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

Если вы хотите увидеть все кровавые подробности в удобочитаемой для человека форме, вы можете использовать:

import platform;

print(platform.sys.version);

Выход для моей системы:

3.6.5 |Anaconda, Inc.| (default, Apr 29 2018, 16:14:56) 
[GCC 7.2.0]

Что-то очень подробное, но машинно-разборное было бы получить version_info объект из platform.sysвместо этого, а затем использовать его свойства, чтобы принять заранее определенный курс действий. Например:

import platform;

print(platform.sys.version_info)

Вывод на мою систему:

sys.version_info(major=3, minor=6, micro=5, releaselevel='final', serial=0)

Лучшее решение зависит от того, сколько кода несовместимо. Если есть много мест, вам нужно поддерживать 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/

ура

Вот код, который я использую с 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 )

Чтобы сделать скрипты совместимыми с Python2 и 3, я использую:

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

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

Обратите внимание, что я не прекращаю выполнение, этот фрагмент просто:
- ничего не делать, если точная версия соответствует
- напишите INFO, если ревизия (последний номер) отличается
- написать ПРЕДУПРЕЖДЕНИЕ, если какой-либо из основных + второстепенных отличается

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

Поскольку все, что вас интересует, это наличие у вас Python 2 или 3, немного хакерский, но, безусловно, самый простой и 100% работающий способ сделать это будет следующим: python python_version_major = 3/2*2 Единственный недостаток этого заключается в том, что когда есть Python 4, он, вероятно, все еще даст вам 3.

Другие вопросы по тегам