如何在运行时检测Python版本?

How do I detect the Python version at runtime?

本问题已经有最佳答案,请猛点这里访问。

我有一个python文件,它可能必须支持python版本<3.x和>=3.x。有没有一种方法来内省python运行时,以了解它正在运行的版本(例如,2.6 or 3.2.x


当然,看看sys.versionsys.version_info

例如,要检查您是否正在运行python3.x,请使用

1
2
3
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版本?


尝试此代码,应该可以:

1
2
import platform
print(platform.python_version())


根据sys.hexversion和api和abi版本:

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


最佳解决方案取决于有多少代码是不兼容的。如果有很多地方需要支持python 2和3,那么six就是兼容模块。如果你想检查版本,six.PY2six.PY3是两个布尔值。

但是,比使用很多if语句更好的解决方案是尽可能使用six兼容函数。假设,如果python 3000有一个新的next语法,那么有人可以更新six,这样旧代码仍然可以工作。

1
2
3
4
5
6
7
8
9
10
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网站/

干杯


为了防止您想以人类可读的形式查看所有血腥的细节,您可以使用:

1
2
3
import platform;

print(platform.sys.version);

系统输出:

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

一些非常详细但可以机器处理的东西是从platform.sys获得version_info对象,然后使用其属性采取预定的操作过程。例如:

1
2
3
import platform;

print(platform.sys.version_info)

我的系统上的输出:

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

下面是我在sys.version_info中使用的一些代码,用于检查python安装:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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)
"
% (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兼容,我使用:

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


因为您所感兴趣的只是您是否有python 2或3,有点黑客,但绝对是最简单和100%的工作方式,如下所示:python
python_version_major = 3/2*2
唯一的缺点是,当有python4时,它可能仍然会给你3。


下面的版本检查示例。

请注意,我不会停止执行,此代码段只是:
-如果精确版本匹配,则不执行任何操作
-如果版本(最后一个数字)不同,则写入信息
-如果任何一个大调+小调不同,则写警告

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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)