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

pri*_*iya 261 python

我有一个Python文件,可能必须支持Python版本<3.x和> = 3.x. 有没有办法反省Python运行时知道它正在运行的版本(例如2.6 or 3.2.x)?

Chr*_*ris 432

当然,看看sys.versionsys.version_info.

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

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

sys.version_info[0]是主要版本号.sys.version_info[1]会给你次要的版本号.

在Python 2.7及更高版本中,组件sys.version_info也可以通过名称访问,因此主要版本号是sys.version_info.major.

另请参阅如何在使用新语言功能的程序中检查Python版本?

  • @iBug 是正确的。该文档特别指出,为了我们的目的,应使用 sys.version_info 。https://docs.python.org/3/library/sys.html#sys.version (7认同)
  • 不要检查 `sys.version` 的值。仅将其用于显示目的。 (3认同)
  • @Almenon `sys.version` 旨在向用户显示。它不是一个程序友好的界面,因此*不要从中提取版本信息*(如 Python 文档所述)。 (3认同)
  • @iBug请解释为什么不应该检查sys.version。 (2认同)
  • 您可以将其与“sys.version_info &gt;= (3,8,5)”或“sys.version_info &gt;= (3,8)”等元组进行比较,但请注意版本 3.8.5 不*等于*“ (3,8)`因为它比较了`version_info`中的所有值,根据文档,这些值是`major、minor、micro、releaselevel和serial`。 (2认同)
  • 我发现使用命名属性“sys.version_info.major”比使用索引更具可读性。 (2认同)

小智 72

尝试此代码,这应该工作:

import platform
print(platform.python_version())
Run Code Online (Sandbox Code Playgroud)

  • 如果您希望版本号中的每个元素都为整数,则可以使用`platform.python_version_tuple()`。此方法可能优于sys.version_info [因为](https://docs.python.org/2/library/platform.html#platform.python_version):“与Python sys.version不同,返回值将始终包含补丁级别” (3认同)

小智 23

每个sys.hexversionAPI和ABI版本控制:

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

  • 您还可以执行类似`if sys.version_info> =(3,6,0)`的操作,因为元组可以直接比较. (15认同)
  • @adzenith,我认为您的回答是最快,最简洁,最容易理解的。您应该将其发布为答案。 (2认同)

Ben*_*ner 11

最佳解决方案取决于代码不兼容的程度.如果有很多地方需要支持Python 2和3,那么six是兼容性模块.six.PY2six.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)
Run Code Online (Sandbox Code Playgroud)

http://pythonhosted.org/six/

干杯


Mic*_*eyn 9

如果您想以人类可读的形式查看所有血腥细节,您可以使用:

import platform;

print(platform.sys.version);
Run Code Online (Sandbox Code Playgroud)

我系统的输出:

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

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

import platform;

print(platform.sys.version_info)
Run Code Online (Sandbox Code Playgroud)

我的系统输出:

sys.version_info(major=3, minor=6, micro=5, releaselevel='final', serial=0)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,“platform.sys”只是“sys”包,因此您最好只执行“import sys;” 打印(系统版本)`。事实上,我根本没有看到“sys”[记录在“platform”包中](https://docs.python.org/3/library/platform.html) (2认同)

Ale*_*lds 6

这是我sys.version_info用来检查Python安装的一些代码:

def check_installation(rv):
    current_version = sys.version_info
    if current_version[0] == rv[0] and current_version[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 'check_installation' function checks if Python is >= 2.7 and < 3
required_version = (2,7)
check_installation(required_version)
Run Code Online (Sandbox Code Playgroud)