如何在运行时检测 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.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
。
另见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 >= (3,8,5)
或sys.version_info >= (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.version
是 str
。)【参考方案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 >= (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.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/
干杯
【讨论】:
【参考方案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 检测浏览器名称和版本? [复制]