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

如何检查运行脚本的Python版本?,python,version,Python,Version,如何检查Python解释器的哪个版本正在解释我的脚本?此信息在模块中的字符串中提供: 可读性: >>> 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)] 为了进一步处理,使用或: 要确保脚本以Python解释器的最低版本要求运行,请将以下内容添

如何检查Python解释器的哪个版本正在解释我的脚本?

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

可读性:

>>> 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)]
为了进一步处理,使用或:

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

assert sys.version_info >= (2, 5)
这将比较主要版本信息和次要版本信息。将micro(
0
1
等)甚至releaselevel(
'alpha'
'final'
等)添加到元组中。然而,请注意,几乎总是最好“闪避”检查某个功能是否存在,如果没有,则检查变通方法(或退出)。有时,新版本中的功能会消失,被其他版本取代

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

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

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

>>> 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!"
>>>
比如说:

#!/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)
#/usr/bin/env/python
导入系统

如果像Seth所说的sys.version_info,主脚本可以检查sys.version_info
(但请注意,这在2.0之前不会出现,因此如果要支持旧版本,需要检查sys模块的另一个version属性)

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

try:
    pass
except:
    pass
finally:
    pass
但在较旧的Python版本中不起作用,因为您只能使用except或最终匹配try。因此,为了与较早的Python版本兼容,您需要编写:

try:
    try:
        pass
    except:
        pass
finally:
    pass
我喜欢这样的东西

>>> import sys
>>> sys.hexversion
33883376
>>> '%x' % sys.hexversion
'20504f0'
>>> sys.hexversion < 0x02060000
True
导入系统 >>>sys.hexversion 33883376 >>>“%x”%sys.hexversion ‘20504f0’ >>>sys.hexversion<0x02060000 真的
如果您在linux上工作,只需发出命令
python
输出如下

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

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

键入“帮助”、“版权”、“信用证”或“许可证”了解更多信息 信息

从命令行(注意大写字母“V”):

这在“manpython”中有记录

从IPython控制台

!python -V
从stdlib中使用:

from platform import python_version
print(python_version())

# 3.9.2

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

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

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)
最简单的方法 只需在终端中键入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.
>>> 

使用
six
模块,您可以通过以下方式进行操作:

import six

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

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

为了好玩,下面是在cpython1.0-3.7b2、Pypy、Jython和Micropython上实现它的一种方法。这与其说是现代代码中的一种实现方式,不如说是一种好奇心。我是作为的一部分编写的,它是一个脚本,用于同时在多个版本的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")

检查Python版本:
Python-V
Python--version
apt-cache-policy-Python


您还可以运行
Where is python
,查看安装了多少版本。

sys.version\u info
从3.7开始似乎不会返回
元组。相反,它返回一个特殊的类,所以所有使用元组的示例都不起作用,至少对我来说是这样。下面是python控制台的输出:

>>> import sys
>>> type(sys.version_info)
<class 'sys.version_info'>
检查您是否正在运行Python 3。您甚至可以使用。。。

导入系统 版本=sys.version\u信息 如果主要版本>2: 如果ver.major==3,并且如果要检测Python 3之前的版本,并且不想导入任何内容,则使用ver.minor。。。 …您可以(ab)使用列表理解范围更改,并在单个表达式中执行此操作:

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

要验证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'
输出


更简单最简单的方法:

在Spyder中,启动一个新的“IPython控制台”,然后运行任何现有脚本

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

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


要在单个命令中从命令行进行检查,但包括主版本、次版本、微版本、releaselevel和串行版本,请调用与脚本相同的Python解释器(即相同路径):

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

3.7.6-final-0

注意:
.format()
而不是f-strings或
。.join()
允许您使用任意格式和分隔符,例如,使其成为一个可greppable的单字字符串。我将其放入一个bash实用程序脚本中,该脚本报告所有重要版本:python、numpy、pandas、sklearn、MacOS、xcode、clang、brew、conda、anaconda、gcc/g++等。对于日志记录、可复制性、疑难解答M bug报告等非常有用。

尝试使用
os.popen
在变量中读取它:

import os
ver = os.popen('python -V').read().strip()
print(ver)

这是不正确的(或者至少是不完整的),因为旧的解释器会吐出新的语言结构,例如
x if Pred()else y
。它们将在“lexing”阶段死亡,并且永远没有机会实际执行
exit(1)
。将新语言功能封装到其他文件中是正确的。@MarkRushakoff:您的评论令人困惑。这个答案的哪一方面是错误的?缺少的
else
分支或
我想@MarkRushakoff所说的是,如果你在文件的顶部有这个,还有一个新的语言特性
is_python_3_or_above = (lambda x: [x for x in [False]] and None or x)(True)
c:\>python -V
Python 2.7.16

c:\>py -2 -V
Python 2.7.16

c:\>py -3 -V
Python 3.7.3
For Python 2,'py -2 -m site'
For Python 3,'py -3 -m site'
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
> path/to/your/python -c "import sys; print('{}.{}.{}-{}-{}'.format(*sys.version_info))"

3.7.6-final-0
import os
ver = os.popen('python -V').read().strip()
print(ver)