我该如何检查运行我的脚本的Python解释器版本?
这些信息可以在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_info
或sys.hexversion
:
>>> sys.version_info
(2, 5, 2, 'final', 0)
# or
>>> sys.hexversion
34014192
assert sys.version_info >= (2, 5)
0
,1
等)和偶数发布级别(='alpha'
,'final'
等)添加到元组中。但请注意,通常最好“鸭子式”检查特定功能是否存在,如果不存在,则解决问题(或退出)。有时,某些功能在新版本中消失,被其他功能替换。PY3 = sys.version_info[0] == 3
。 - gcbsys.version_info
中的一些字段作为属性访问,因此 PY3 = sys.version_info.major == 3
可能更加吸引人。 - krs013if sys.version_info >= (3,)
。比较不同长度的元组是完全符合Python风格的,它会自动处理正确的情况。 - user3064538-O
或-OO
参数运行Python文件,assert
语句将被移除。因此,最好使用普通的if语句进行条件检查,如果条件不满足,则退出程序。 - xuiqzy从命令行中(注意大写的 'V'):
python -V
这在 'man python' 文档中有详细说明。
从 IPython 控制台执行
!python -V
!python -V
可能会返回与当前运行的 Python 版本不同的版本。 - Josiah Yoder使用标准库中的platform
的python_version
:
from platform import python_version
print(python_version())
# 3.9.2
我喜欢使用sys.hexversion
来做这样的事情。
>>> import sys
>>> sys.hexversion
33883376
>>> '%x' % sys.hexversion
'20504f0'
>>> sys.hexversion < 0x02060000
True
(2,6,4)
进行比较,'final'
似乎不会影响比较结果,也不应该影响。显然,在比较元组的“最重要”部分时,不需要进行切片操作。这似乎是它的处理方式,这就是我的问题所在。我并不是说这个解决方案没有其优点,我只是想知道为什么它是最好的选择 - 也就是说,我漏掉了什么。 - 0xC0000022L(3,3,0,'rc1','0')
和(3,3,0,'beta','0')
进行比较,就可以了。 - sorin
>>> 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!"
>>>
except Exception:
行已经假定了一个现代(2.x+)的Python。也许未来的Python会以某种不兼容的方式重新排列异常名称?(可能不会,但是谁知道当我们都有Oculus Rift眼球植入物时,Python会变成什么样子呢?代码存在时间很长。) - Seth放置类似以下内容:
#!/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版本可能无法加载脚本,因此无法报告此错误。作为解决方法,您可以在导入具有更现代代码的脚本的脚本中运行上述代码。
x if Pred()else y
)产生错误。它们会在“词法分析”阶段死亡,永远没有机会实际执行 exit(1)
。Seth的答案在将新语言功能封装到其他文件中方面是正确的。 - Mark Rushakoffelse
分支还是使用<
来表示version_info
?据我所知,Python会在元组中填充缺失的值,而且在2.6之前,所有这些都应该是有效的,对吧?所以Seth的答案使用了切片(多余),而这个答案没有使用,这使得你的评论更加令人困惑。 - 0xC0000022L以下是一个短的命令行版本,可以直接退出(对于脚本和自动执行非常方便):
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)
python2 --version
和python3 --version
的输出来获取版本号。虽然我可以通过passthru()
轻松获取后者,但是前者只会打印到屏幕上而无法被捕获,即使将其重定向到文件中也不行... - Toxprint()
将输出写入文件。 - Wolphpassthru()
输出重定向到文件中。你的解决方案正好满足了我的需求。 :) - Toxpython -c "assert __import__('sys').version_info[:2] >= (3, 6)"
。 - Alex Kosh使用six
模块,您可以通过以下方式实现:
import six
if six.PY2:
# this is python2.x
else:
# six.PY3
# this is python3.x
import sys
sys.version.split(' ')[0]
sys.version提供了您想要的内容,只需选择第一个数字即可 :)
已经有几个答案建议如何查询当前的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")
python_version = int(str(range(3))[-2])
- Chris_Rands