如何检查正在运行脚本的Python版本?

1463

我该如何检查运行我的脚本的Python解释器版本?


5
当前主题是关于从Python程序/脚本中检查Python版本。如果您想要从命令行检查计算机上安装的Python解释器版本,请参考以下帖子 - 我安装了哪个版本的Python? - RBT
11
这是一种有趣的方法来区分Python 3和2... python_version = int(str(range(3))[-2]) - Chris_Rands
@RBT:对于从命令行进行一行检查,请参见我的答案 - smci
27个回答

1676

这些信息可以在sys模块的sys.version字符串中找到:

>>> import sys

人类可读:

>>> print(sys.version)  # parentheses necessary in python 3.       
2.5.2 (r252:60911, Jul 31 2008, 17:28:52) 
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)]

要进行进一步处理,请使用sys.version_infosys.hexversion

>>> sys.version_info
(2, 5, 2, 'final', 0)
# or
>>> sys.hexversion
34014192

为了确保脚本在Python解释器的最低版本要求下运行,请将以下内容添加到您的代码中:
assert sys.version_info >= (2, 5)

这比较主要和次要版本信息。按需将微版本(=01等)和偶数发布级别(='alpha''final'等)添加到元组中。但请注意,通常最好“鸭子式”检查特定功能是否存在,如果不存在,则解决问题(或退出)。有时,某些功能在新版本中消失,被其他功能替换。

47
这实际上是打印输出的语法,而不是用于检查版本。我在我的 Python 2 和 3 脚本中使用它:PY3 = sys.version_info[0] == 3 - gcb
8
PY2 = sys.version_info[0] == 2 PY3 = sys.version_info[0] == 3(翻译): PY2 = sys.version_info[0] == 2 表示Python版本为2.x系列, PY3 = sys.version_info[0] == 3 表示Python版本为3.x系列。 - xiaoweiz
32
您还可以将sys.version_info中的一些字段作为属性访问,因此 PY3 = sys.version_info.major == 3 可能更加吸引人。 - krs013
7
当Python 4发布时,你的代码片段将会出错。你应该这样写:if sys.version_info >= (3,)。比较不同长度的元组是完全符合Python风格的,它会自动处理正确的情况。 - user3064538
6
如果使用-O-OO参数运行Python文件,assert语句将被移除。因此,最好使用普通的if语句进行条件检查,如果条件不满足,则退出程序。 - xuiqzy
显示剩余4条评论

423

从命令行中(注意大写的 'V'):

python -V

这在 'man python' 文档中有详细说明。

从 IPython 控制台执行

!python -V

8
请注意,!python -V 可能会返回与当前运行的 Python 版本不同的版本。 - Josiah Yoder
10
这并没有回答问题。 - carrier

116

99

我喜欢使用sys.hexversion来做这样的事情。

>>> import sys
>>> sys.hexversion
33883376
>>> '%x' % sys.hexversion
'20504f0'
>>> sys.hexversion < 0x02060000
True

3
@0xC0000022L 你是否曾经想过如何比较元组中的文本?'final'与beta、rc或其他可能存在的版本相比如何?如果您有一个数字值,您将始终能够指定一个精确的版本。 - sorin
1
@sorin:嗯,这并不重要,对吧?如果我与(2,6,4)进行比较,'final'似乎不会影响比较结果,也不应该影响。显然,在比较元组的“最重要”部分时,不需要进行切片操作。这似乎是它的处理方式,这就是我的问题所在。我并不是说这个解决方案没有其优点,我只是想知道为什么它是最好的选择 - 也就是说,我漏掉了什么。 - 0xC0000022L
只要你不将(3,3,0,'rc1','0')(3,3,0,'beta','0')进行比较,就可以了。 - sorin
16
发布级别定义为 'alpha'(测试版)、'beta'(公测版)、'candidate'(候选版)或 'final'(正式版),这些级别也可以进行正确比较。 - Fredrik

72
你最好的选择可能是这样的:

>>> import sys
>>> sys.version_info
(2, 6, 4, 'final', 0)
>>> if not sys.version_info[:2] == (2, 6):
...    print "Error, I need python 2.6"
... else:
...    from my_module import twoPointSixCode
>>> 

此外,您可以始终在简单的try语句中包装您的导入,这将捕获语法错误。并且,针对@Heikki的观点,此代码将与旧版本的Python兼容:

>>> try:
...     from my_module import twoPointSixCode
... except Exception: 
...     print "can't import, probably because your python is too old!"
>>>

4
为什么要使用“plain Exception”而不是“ImportError”? :P(说明:“plain Exception”可能指的是通用异常,而“ImportError”则是特定的异常类型。在上下文中,这句话可能是在讨论编程语言中的异常处理。) - deadly
5
@deadly - ImportError 捕获不了 SyntaxErrors,如果您尝试在旧版 Python 中使用新语法,例如在 pre-2.5 中尝试使用 shortcut conditional,则会引发 SyntaxErrors 错误。 - Seth
1
"except Exception"太宽泛了。使用你所期望的具体异常会更好,不是吗? - user
2
@Fermiparadox - 保持广泛性可以降低假设。单独的 except Exception: 行已经假定了一个现代(2.x+)的Python。也许未来的Python会以某种不兼容的方式重新排列异常名称?(可能不会,但是谁知道当我们都有Oculus Rift眼球植入物时,Python会变成什么样子呢?代码存在时间很长。) - Seth

50

放置类似以下内容:

#!/usr/bin/env/python
import sys
if sys.version_info<(2,6,0):
  sys.stderr.write("You need python 2.6 or later to run this script\n")
  exit(1)

在你的脚本顶部。

请注意,根据脚本中包含的其他内容,比目标版本较旧的Python版本可能无法加载脚本,因此无法报告此错误。作为解决方法,您可以在导入具有更现代代码的脚本的脚本中运行上述代码。


7
这是错误的(或者至少不完整),因为旧的解释器会对新的语言结构(例如x if Pred()else y)产生错误。它们会在“词法分析”阶段死亡,永远没有机会实际执行 exit(1)Seth的答案在将新语言功能封装到其他文件中方面是正确的。 - Mark Rushakoff
2
@MarkRushakoff:你的评论有点令人困惑。这个答案哪一方面是错误的?是缺少else分支还是使用<来表示version_info?据我所知,Python会在元组中填充缺失的值,而且在2.6之前,所有这些都应该是有效的,对吧?所以Seth的答案使用了切片(多余),而这个答案没有使用,这使得你的评论更加令人困惑。 - 0xC0000022L
6
@MarkRushakoff的意思是,如果你在文件顶部有这个声明,并且在同一个文件的其他地方有新的语言特性,旧版本的Python在加载该文件时将会崩溃,而不会显示任何错误。因此,你需要在文件顶部添加上述代码(或其他检查代码),然后从单独的文件中导入需要新版Python的代码。 - rjmunro

33

以下是一个短的命令行版本,可以直接退出(对于脚本和自动执行非常方便):

python -c "print(__import__('sys').version)"

或者只包括主版本、次版本和修订版本号:

python -c "print(__import__('sys').version_info[:1])" # (2,)
python -c "print(__import__('sys').version_info[:2])" # (2, 7)
python -c "print(__import__('sys').version_info[:3])" # (2, 7, 6)

很好,这解决了我的问题,我之前通过捕获在PHP中的python2 --versionpython3 --version的输出来获取版本号。虽然我可以通过passthru()轻松获取后者,但是前者只会打印到屏幕上而无法被捕获,即使将其重定向到文件中也不行... - Tox
1
@tox 如果更方便的话,你可以告诉 print() 将输出写入文件。 - Wolph
在我的情况下,这更多的是相同的,因为我已经将 passthru() 输出重定向到文件中。你的解决方案正好满足了我的需求。 :) - Tox
谢谢。在我的情况下,添加assert来验证版本是否符合退出代码是有用的:python -c "assert __import__('sys').version_info[:2] >= (3, 6)" - Alex Kosh

14

使用six模块,您可以通过以下方式实现:

import six

if six.PY2:
  # this is python2.x
else:
  # six.PY3
  # this is python3.x

9
import sys
sys.version.split(' ')[0]

sys.version提供了您想要的内容,只需选择第一个数字即可 :)


5

已经有几个答案建议如何查询当前的Python版本。为了程序化地检查版本要求,我将使用以下两种方法之一:

# Method 1: (see krawyoti's answer)
import sys
assert(sys.version_info >= (2,6))

# Method 2: 
import platform
from distutils.version import StrictVersion 
assert(StrictVersion(platform.python_version()) >= "2.6")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接