如何在运行时检测 Python 版本? [复制]

Posted

技术标签:

【中文标题】如何在运行时检测 Python 版本? [复制]【英文标题】:How do I detect the Python version at runtime? [duplicate] 【发布时间】:2012-02-23 03:24:51 【问题描述】:

我有一个 Python 文件,它可能必须支持 = 3.x 的 Python 版本。有没有办法自省 Python 运行时以了解它正在运行的版本(例如,2.6 or 3.2.x)?

【问题讨论】:

import sys; print(sys.version) 输出3.9.6 (default, Aug 18 2021, 12:38:10) [Clang 10.0.0 ] 【参考方案1】:

当然,看看sys.versionsys.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

另见How can I check for Python version in a program that uses new language features?

【讨论】:

不要检查sys.version的值。仅用于显示目的。 @iBug 请解释为什么不应该检查 sys.version。 @Almenon sys.version 旨在向用户显示。它不是一个程序友好的界面,因此不要从中提取版本信息(如 Python 文档所述)。 @iBug 是正确的。文档特别说明了在此处使用 sys.version_info 来实现我们的目的。 docs.python.org/3/library/sys.html#sys.version 您可以将其与sys.version_info &gt;= (3,8,5)sys.version_info &gt;= (3,8) 之类的元组进行比较,但请注意,3.8.5 版本与(3,8)等于,因为它比较所有version_info 中的值,根据文档,它们是 major, minor, micro, releaselevel, and serial【参考方案2】:

试试这个代码,这应该可以工作:

import platform
print(platform.python_version())

【讨论】:

仅供参考,这可行,但python_version 函数返回一个字符串(例如,在我的系统上它打印'3.6.1')。如果您正在像 OP 一样在 if 语句中检查版本,那么 Chris 的回答会更有意义,因为您不必经历在字符串中搜索所需信息的繁琐过程。如果您想记录或显示供人类阅读的版本,则此答案是可行的方法。 @NauticalMile Chris 的回答也返回了一个字符串,他只是索引第一个字符以查看它是否为'3';在这里也一样。 锄头这是否更好地解决了问题,如果没有的话?使用 sys.version_info[0] 或者只使用 sys.version[0] 已经足够了...... 如果你希望版本号中的每个元素都是一个int,你可以使用platform.python_version_tuple()。此方法可能优于 sys.version_info because:“与 Python sys.version 不同,返回值将始终包含补丁级别” @weberc2,克里斯的回答没有返回字符串,至少没有sys.version_info 选项。这实际上是一个 sys.version_info 类型,恰好是可索引的。 (当然,sys.versionstr。)【参考方案3】:

根据sys.hexversion 和API and ABI Versioning:

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

【讨论】:

因为这允许在一个简单易读的测试中同时测试主要 次要版本,我认为这是最好的答案。 你也可以做类似if sys.version_info &gt;= (3,6,0)的事情,因为元组是直接可比的。 @adzenith ,我认为您的回答是最快、最简洁、最容易理解的。您应该将其发布为答案。 很遗憾,我无法为这个问题添加答案 - 也许它太旧了,或者可能是因为它被标记为重复?【参考方案4】:

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

import platform;

print(platform.sys.version);

我的系统的输出:

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

一些非常详细但机器可解析的方法是从platform.sys 获取version_info 对象,然后使用其属性采取预定的行动。例如:

import platform;

print(platform.sys.version_info)

我的系统上的输出:

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

【讨论】:

请注意 platform.sys 只是 sys 包,所以你最好只使用 import sys; print(sys.version)。事实上,我根本没有看到 sys 和 documented in the platform package 一样【参考方案5】:

最佳解决方案取决于有多少代码不兼容。如果有很多地方需要支持 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)

http://pythonhosted.org/six/

干杯

【讨论】:

【参考方案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)

【讨论】:

【参考方案7】:

为了使脚本与 Python2 和 3 兼容,我使用:

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

【讨论】:

这个没必要,加from__future__ import print_function不做版本检查。导入在 Python 3 中没有任何作用。 这段代码甚至不起作用,它是一个SyntaxError,因为from __future__ 导入必须发生在文件的最顶部。【参考方案8】:

以下版本检查示例。 注意,我并没有停止执行,这个 sn -p 只是: - 如果完全匹配,则不执行任何操作 - 如果修订版(最后一个数字)不同,则写入 INFO - 如果任何主要和次要不同,则写 WARN

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)

【讨论】:

【参考方案9】:

由于您感兴趣的只是您使用的是 Python 2 还是 Python 3,所以有点骇人听闻,但绝对是最简单且 100% 可行的方法如下: python python_version_major = 3/2*2 唯一的缺点是,当有 Python 4 时,它可能仍然会给你 3。

【讨论】:

这段代码在未来化后给出了错误的答案。

以上是关于如何在运行时检测 Python 版本? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OS X 上将 Python 的默认版本设置为 3.x? [复制]

如何使用 javascript 检测浏览器名称和版本? [复制]

如何阻止 python RuntimeWarning 打印到终端? [复制]

如何在我的 python 项目中添加蜂鸣器? [复制]

智能运维:系统监控数据异常检测——随机森林篇

如何查看安装了哪些 Python 模块以及版本? [复制]