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

How do I check what version of Python is running my script?

如何检查什么版本的python解释器正在解释我的脚本?


此信息在sys模块的sys.version字符串中提供:

1
>>> import sys

人类可读的:

1
2
3
>>> 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)]

进一步处理:

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

要确保脚本以最低版本要求的Python解释器运行,请将此添加到代码中:

1
assert sys.version_info >= (2, 5)

这将比较主要和次要版本信息。添加micro(=01等)甚至releaselevel(='alpha''final'等)到tuple中。但是请注意,最好是"回避"检查是否存在某个特性,如果不存在,则进行变通(或纾困)。有时,新版本中的特性会被其他版本取代。


从命令行(注意大写"V"):

1
python -V

这在《Python侠》中有记载。


我喜欢这样的东西。

http://docs.python.org/library/sys.html sys.hexversion

1
2
3
4
5
6
7
>>> import sys
>>> sys.hexversion
33883376
>>> '%x' % sys.hexversion
'20504f0'
>>> sys.hexversion < 0x02060000
True


你的最佳选择可能是这样的:

1
2
3
4
5
6
7
8
>>> 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
>>>

此外,您可以总是用一个简单的尝试来包装导入,这会捕获语法错误。而且,就@heikki而言,这段代码将与更旧版本的python兼容:

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


从stdlib中使用platformpython_version

1
2
3
>>> from platform import python_version
>>> print(python_version())
2.7.8


输入如下内容:

1
2
3
4
5
6
#!/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
"
)
  exit(1)

在脚本的顶部。

请注意,根据脚本中的其他内容,比目标版本更旧的python可能甚至无法加载脚本,因此无法足够远地报告此错误。作为解决方法,您可以在一个脚本中运行上述内容,该脚本使用更现代的代码导入脚本。


下面是一个简短的命令行版本,它直接退出(方便脚本和自动执行):

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

或者只是大调、小调和小调:

1
2
3
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)


使用six模块,您可以通过以下方式完成:

1
2
3
4
5
6
7
import six

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

最简单的方法

只需在终端中键入python,就可以看到版本如下所示

1
2
3
4
5
desktop:~$ python
Python 2.7.6 (default, Jun 22 2015, 18:00:18)
[GCC 4.8.2] on linux2
Type"help","copyright","credits" or"license" for more information.
>>>


正如seth所说,主脚本可以检查sys.version_info(但请注意,直到2.0才会出现这种情况,因此,如果希望支持旧版本,则需要检查sys模块的另一个版本属性)。

但是您仍然需要注意不要在文件中使用在旧版本的Python中不可用的任何Python语言功能。例如,在python 2.5及更高版本中允许这样做:

1
2
3
4
5
6
try:
    pass
except:
    pass
finally:
    pass

但在旧的Python版本中不起作用,因为您只能尝试except或finally匹配。因此,为了与旧的Python版本兼容,您需要编写:

1
2
3
4
5
6
7
try:
    try:
        pass
    except:
        pass
finally:
    pass

1
2
import sys
sys.version.split(' ')[0]

sys.version提供您想要的,只需选择第一个号码:)


检查python版本:python -Vpython --versionapt-cache policy python

您还可以运行whereis python查看安装了多少个版本。


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

1
2
3
4
5
6
7
8
# 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解释器之前查看msdos脚本以检查版本(为了避免python版本语法异常),请参阅解决方案:

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

MS脚本;python版本检查python模块的预启动网址:http://pastebin.com/aauj91fq(脚本可能易于转换为其他操作系统脚本。)


为了好玩,下面是在CPython1.0-3.7B2、Pypy、Jython和Micropython上进行的一种方法。这更像是一种好奇心,而不是用现代代码来实现的方法。我将其作为http://stromberg.dnsalias.org/~strombrg/pythons/的一部分编写,这是一个脚本,用于同时在许多版本的python上测试代码片段,因此您可以很容易地了解哪些python功能与哪些版本的python兼容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
via_platform = 0
check_sys = 0
via_sys_version_info = 0
via_sys_version = 0
test_sys = 0
try:
    import platform
except (ImportError, NameError):
    # We have no platform module - try to get the info via the sys module
    check_sys = 1

if not check_sys:
    if hasattr(platform,"python_version"):
        via_platform = 1
    else:
        check_sys = 1

if check_sys:
    try:
        import sys
        test_sys = 1
    except (ImportError, NameError):
        # just let via_sys_version_info and via_sys_version remain False - we have no sys module
        pass

if test_sys:
    if hasattr(sys,"version_info"):
        via_sys_version_info = 1
    elif hasattr(sys,"version"):
        via_sys_version = 1
    else:
        # just let via_sys remain False
        pass

if via_platform:
    # This gives pretty good info, but is not available in older interpreters.  Also, micropython has a
    # platform module that does not really contain anything.
    print(platform.python_version())
elif via_sys_version_info:
    # This is compatible with some older interpreters, but does not give quite as much info.
    print("%s.%s.%s" % sys.version_info[:3])
elif via_sys_version:
    import string
    # This is compatible with some older interpreters, but does not give quite as much info.
    verbose_version = sys.version
    version_list = string.split(verbose_version)
    print(version_list[0])
else:
    print("unknown")

截至3.7,sys.version_info似乎没有返回tuple。相反,它返回一个特殊的类,所以至少对我来说,所有使用元组的示例都不起作用。下面是Python控制台的输出:

1
2
3
>>> import sys
>>> type(sys.version_info)
<class 'sys.version_info'>

我发现使用sys.version_info.majorsys.version_info.minor的组合似乎足够了。例如,。。。

1
2
3
4
import sys
if sys.version_info.major > 3:
    print('Upgrade to Python 3')
    exit(1)

检查是否运行python 3。您甚至可以使用以下命令检查更具体的版本…

1
2
3
4
5
6
import sys
ver = sys.version_info
if ver.major > 2:
    if ver.major == 3 and ver.minor <= 4:
        print('Upgrade to Python 3.5')
        exit(1)

可以检查是否至少运行了python 3.5。


要验证Windows上命令的python版本,请在命令提示符中运行以下命令并验证输出

1
2
3
4
5
6
7
8
c:\>python -V
Python 2.7.16

c:\>py -2 -V
Python 2.7.16

c:\>py -3 -V
Python 3.7.3

另外,要查看每个Python版本的文件夹配置,请运行以下命令:

1
2
For Python 2,'py -2 -m site'
For Python 3,'py -3 -m site'

如果您想检测python 3之前的版本并且不想导入任何内容…

…您可以(ab)使用列表理解范围更改,并在单个表达式中执行此操作:

1
is_python_3_or_above = (lambda x: [x for x in [False]] and None or x)(True)

如果您在Linux上工作,只需发出命令python输出如下

Python 2.4.3 (#1, Jun 11 2009, 14:09:37)

[GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] on linux2

Type"help","copyright","credits" or"license" for more
information.