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

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

1760628 次浏览

此信息在#1模块的#0字符串中可用:

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

如需进一步处理,请使用#0#1

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

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

assert sys.version_info >= (2, 5)

这比较了主要和次要版本信息。根据需要向元组添加微(=01等)甚至发行版(='alpha''final'等)。然而,请注意,最好“鸭子”检查某个功能是否存在,如果没有,则解决(或保释)。有时功能在较新版本中消失,被其他功能取代。

import syssys.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/pythonimport sysif sys.version_info<(2,6,0):sys.stderr.write("You need python 2.6 or later to run this script\n")exit(1)

在你剧本的顶部。

请注意,根据脚本中的其他内容,目标版本以外的旧版本的python甚至可能无法加载脚本,因此无法报告此错误。作为一种解决方法,你可以在导入带有更现代代码的脚本的脚本中运行上述内容。

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

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

try:passexcept:passfinally:pass

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

try:try:passexcept:passfinally:pass

我喜欢#0这样的东西。

>>> import sys>>> sys.hexversion33883376>>> '%x' % sys.hexversion'20504f0'>>> sys.hexversion < 0x02060000True

如果你在Linux上工作,只要给命令python输出就会像这样

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

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

键入“帮助”、“版权”、“学分”或“许可”以获取更多信息信息。

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

python -V

这在“man python”中有记录。

从IPython控制台

!python -V

使用stdlib中的#0的#1

from platform import python_versionprint(python_version())
# 3.9.2

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

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)

最简单的方法

只需在终端中输入python,您就可以看到版本如

desktop:~$ pythonPython 2.7.6 (default, Jun 22 2015, 18:00:18)[GCC 4.8.2] on linux2Type "help", "copyright", "credits" or "license" for more information.>>>

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

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

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

# Method 1: (see krawyoti's answer)import sysassert(sys.version_info >= (2,6))
# Method 2:import platformfrom distutils.version import StrictVersionassert(StrictVersion(platform.python_version()) >= "2.6")

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

via_platform = 0check_sys = 0via_sys_version_info = 0via_sys_version = 0test_sys = 0try:import platformexcept (ImportError, NameError):# We have no platform module - try to get the info via the sys modulecheck_sys = 1
if not check_sys:if hasattr(platform, "python_version"):via_platform = 1else:check_sys = 1
if check_sys:try:import systest_sys = 1except (ImportError, NameError):# just let via_sys_version_info and via_sys_version remain False - we have no sys modulepass
if test_sys:if hasattr(sys, "version_info"):via_sys_version_info = 1elif hasattr(sys, "version"):via_sys_version = 1else:# just let via_sys remain Falsepass
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.versionversion_list = string.split(verbose_version)print(version_list[0])else:print("unknown")

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

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

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

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

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

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

检查您是否正在运行Python 3。您甚至可以使用…

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

可以检查您是否至少运行Python 3.5。

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

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

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

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

c:\>python -VPython 2.7.16
c:\>py -2 -VPython 2.7.16
c:\>py -3 -VPython 3.7.3

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

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: 1013sys.version_info: sys.version_info(major=3, minor=6, micro=5, releaselevel='final', serial=0)sys.hexversion: 50726384

最简单的方法:

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

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

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

在此处输入图片描述

从命令行检查,在一个命令中,但包括主要,次要,微型版本,发行版和串行,然后调用与您用于脚本的相同的Python解释器(即相同的路径):

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

注意:.format()而不是f字符串或'.'.join()允许您使用任意格式和分隔符字符,例如使其成为一个可接受的单字字符串。我把它放在一个bash实用脚本中,该脚本报告所有重要版本:python、numpy、熊猫、sklear、MacOS、xcode、clang、brew、conda、anaconda、gcc/g++等。对日志记录、可复制性、故障排除bug报告等很有用。

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

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

对于windows,转到命令提示符并键入此命令以获取python版本:

python --version

python -V

这只返回2.73.63.9

import syscurrent_version = ".".join(map(str, sys.version_info[0:2]))

这就是你通常需要的…

所有的答案都有深刻的见解

另一种方法是platform.python_version_tuple()

python3 -c “import platform; print(platform.python_version_tuple())”
(‘3’, ‘6’, ‘8’)