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


1183

如何检查正在解释脚本的版本的Python Interpreter?


1
当前线程是关于从python程序/脚本检查python版本。如果您希望通过命令行检查机器上安装的python解释器的版本,请参考以下文章- 我已安装哪个Python版本?
RBT

1
这是分离python 3和2的一种有趣方式...python_version = int(str(range(3))[-2])
Chris_Rands

@RBT:要从命令行进行单行检查,请参阅我的回答
smci

Answers:


1377

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
(2, 5, 2, 'final', 0)
# or
>>> sys.hexversion
34014192

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

assert sys.version_info >= (2, 5)

这将比较主要版本和次要版本信息。微(=添加01等等),甚至releaselevel(= 'alpha''final'等)的元组只要你喜欢。但是请注意,最好总是“躲开”检查是否存在某个功能,如果不存在,则要变通(或纾困)。有时,某些功能在较新的版本中会消失,而被其他功能取代。


39
它实际上是打印的语法。不用于检查版本。我在python 2和3脚本中使用了它:PY3 = sys.version_info[0] == 3
gcb

5
PY2 = sys.version_info [0] == 2 PY3 = sys.version_info [0] == 3
xiaoweiz

25
您还可以访问sys.version_infoas属性中的某些字段,因此PY3 = sys.version_info.major == 3可能更具吸引力。
krs013 '16

1
注意:将sys.hexversion与0x020502F0进行了比较,请参阅docs.python.org/2/library/sys.html#sys.hexversion
Ehrlich,

1
@gcb每当Python 4出现时,您的代码段都会中断。你应该做if sys.version_info >= (3,)。比较不同大小的元组是完全pythonic的,它将做正确的事。
鲍里斯(Boris)

374

在命令行中(注意大写的“ V”):

python -V

在'man python'中有记录。


13
资本V是版本,而不是小写
盗贼

96

我喜欢这样sys.hexversion的东西。

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

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

这是我从未见过的漂亮版本,并且比普通版本更容易使用(至少对我而言)……
Wayne Werner 2010年

6
@sorin:您能解释一下比塞思的答案更好吗?既然您说这是最好的,我想知道。
0xC0000022L13年

3
@ 0xC0000022L您是否曾经想过如何比较元组中的文本?“最终”与beta,rc或其他可能的相比如何。相反,如果您有数字值,则始终可以指定确切的版本。
sorin 2013年

1
@sorin:嗯,那不重要,对吗?如果我比较反对(2,6,4)'final'似乎并没有影响比较,它是不应该。当我比较元组的“最重要”部分时,显然不需要切片。这似乎是如何处理的,这就是我的问题。我并不是说这种解决方案没有优点,我只是想知道为什么它是最好的-即我所缺少的。
0xC0000022L13年

11
发行级别定义为“ alpha”,“ beta”,“ candidate”或“ final”之一,它们也可以正确比较……
Fredrik

65

您最好的选择可能是这样的:

>>> 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兼容:

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

3
为什么是普通的异常而不是ImportError?:P
致命的

4
@deadly-ImportError不会捕获SyntaxErrors,如果您尝试在旧python中使用新语法,例如尝试使用2.5之前的条件中的快捷方式,则会引发SyntaxErrors 。
赛斯

except Exception太广泛了。使用您期望的特定例外会更好吗?
费米悖论

1
@Fermiparadox-广泛地保持低假设。该except Exception:行本身已经采用了现代(2.x +)python。也许将来的某些python将以某种向后不兼容的方式重新排列异常名称?(也许不是,但是谁知道20年后当我们所有人都拥有oculus rift眼球植入物时python会是什么样?代码会持续很长时间。)
Seth

65

使用platformpython_version从STDLIB:

>>> from platform import python_version
>>> print(python_version())
2.7.8

5
对于打印功能,考虑到兼容性,最好在括号内。如果有人在版本3中使用示例,则语法错误将在那里等待。
亚历克斯·蒋

47

放入类似:

#!/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甚至可能无法加载脚本,因此无法报告该错误。解决方法是,您可以在脚本中运行以上命令,该脚本将使用更现代的代码导入该脚本。


6
这是不正确的(或至少是不完整的),因为旧的解释器会拒绝使用新的语言结构,例如x if Pred() else y。他们将在“词汇化”阶段死亡,并且永远没有机会真正执行 exit(1)。 在将新的语言功能封装在其他文件中时,Seth的答案是正确的。
Mark Rushakoff 2010年

2
@MarkRushakoff:您的评论令人困惑。这个答案的哪个方面是错误的?缺少的else分支还是a <用于version_info?AFAIK Python会填充元组中的缺失值,并且所有这些值在2.6之前都应该有效,不是吗?因此,Seth的答案使用切片(冗余),而这一切片没有使用切片,这使您的评论更加混乱。
0xC0000022L13年

5
我认为@MarkRushakoff的意思是,如果在文件顶部具有此功能,并且在同一文件的其他位置具有新的语言功能,则在加载文件之前,旧版本的python将在运行任何文件之前消失,因此不会显示错误。基本上,您必须将以上内容(或其他检查内容)放在文件顶部,然后从单独的文件中导入需要新版本python的代码。
rjmunro

1
是的,@ rjmunro说的是:)
Mark Rushakoff

25

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

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)

1
@vigilancer你是对的,在撰写本文时,它还没有那么重要,但是我现在已经为Python 3更新了它:)
Wolph

很好,这解决了我通过捕获PHP python2 --versionpython3 --versionPHP 的输出来获取版本号的问题。尽管我可以通过后者获得问题passthru(),但是,即使重定向到文件中,前者也只能打印到屏幕上却永远不会被捕获...
Tox

1
@tox print() 如果更方便,您可以告诉写入文件。
Wolph

就我而言,这与我已经将passthru()输出重定向到文件的效果大同小异。您的解决方案完全可以满足我的需求。:)
Tox

14

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

import six

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

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

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


5

最简单的方法

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

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.
>>> 

23
“最简单的方法” ...做与要求不同的事情。
卢克

4

就像Seth所说的那样,主脚本可以检查sys.version_info(但是请注意,直到2.0才出现),因此,如果要支持旧版本,则需要检查sys模块的另一个版本属性。

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

try:
    pass
except:
    pass
finally:
    pass

但在较旧的Python版本中将无法使用,因为您只能使用OR或最终与try匹配。因此,为了与旧版本的Python兼容,您需要编写:

try:
    try:
        pass
    except:
        pass
finally:
    pass

2

一些答案已经建议如何查询当前的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")

2

只是为了好玩,下面是在CPython 1.0-3.7b2,Pypy,Jython和Micropython上执行此操作的一种方法。这更多是出于好奇,而不是现代代码中的一种实现方式。我将其作为http://stromberg.dnsalias.org/~strombrg/pythons/的一部分编写的,该脚本是用于一次在多个python版本上测试代码段的脚本,因此您可以轻松了解python的种类功能与python版本兼容:

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")

2

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

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


3
相同的答案已经发布。并且,问题不是“如何检查已安装的python版本?” 而是“如何检查脚本中的版本”。
斯坦利·寇

2

如果您想检测Python 3之前的版本并且不想导入任何东西...

...您可以(ab)使用列表理解范围的更改,并在单个表达式中完成

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

2

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

c:\>python -V
Python 2.7.16

c:\>py -2 -V
Python 2.7.16

c:\>py -3 -V
Python 3.7.3

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

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

2
from sys import version_info, api_version, version, hexversion

print(f"sys.version: {version}")
print(f"sys.api_version: {api_version}")
print(f"sys.version_info: {version_info}")
print(f"sys.hexversion: {hexversion}")

输出

sys.version: 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)]
sys.api_version: 1013
sys.version_info: sys.version_info(major=3, minor=6, micro=5, releaselevel='final', serial=0)
sys.hexversion: 50726384

对于Python 2.7,必须使用print("sys.version: {}".format(version))
Marco

@马可,对。v 3+使用关键字参数完成了字符串格式化。可以作为python 2.7的print('[{},{},{}]'。format(1,2,3))完成:stackoverflow.com/questions/517355/string-formatting-in-python
oetzi

1

sys.version_infotuple从3.7开始似乎没有返回a 。相反,它返回一个特殊的类,因此至少对于我来说,所有使用元组的示例都不起作用。这是python控制台的输出:

>>> import sys
>>> type(sys.version_info)
<class 'sys.version_info'>

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

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

检查您是否正在运行Python3。您甚至可以使用...检查更特定的版本。

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。


这有点像的子类,namedtuple并将其与元组进行比较肯定可以。要获得完全平等,您需要五个元素的类型:主要,次要,微型,发布级别(字符串)和序列。
米哈伊尔·爱德信

0

最简单的方法:

在Spyder中,启动新的“ IPython Console”,然后运行任何现有脚本。

现在,可以在控制台窗口中打印的第一个输出中看到版本:

“ Python 3.7.3(默认值,2019年4月24日,15:29:51)...”

在此处输入图片说明


0

要从命令行检查,只需一个命令,但要包含主要,次要,微型版本,发行版和序列号

> python -c "import sys; print('{}.{}.{}-{}-{}'.format(*sys.version_info))"

3.7.6-final-0

注意:.format()代替f字符串,或者'.'.join()允许您使用任意格式和分隔符char,例如,使其成为可抓握的单字字符串。我将其放在报告所有重要版本的bash实用程序脚本中:python,numpy,pandas,sklearn,MacOS,xcode,clang,brew,conda,anaconda,gcc / g ++等。对于日志记录,可复制性,故障排除报告等很有用。


-1

如果您在linux上工作,请给出命令python 输出将如下所示

Python 2.4.3(#1,2009年6月11日,14:09:37)

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

键入“帮助”,“版权”,“信用”或“许可证”以获取更多信息。


5
我希望我的python脚本能够获取正在解释它的python版本。正确答案已被接受。
承运人

这无助于获取Python脚本中的版本,也已在之前发布过类似的答案:stackoverflow.com/a/35294211/950762
Akif
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.