如何查看运行我的脚本的Python版本?

car*_*ier 1099 python version

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

kra*_*oti 1300

此信息位于sys模块的sys.version字符串中:

>>> import sys
Run Code Online (Sandbox Code Playgroud)

人类可读:

>>> 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)]
Run Code Online (Sandbox Code Playgroud)

进一步处理:

>>> sys.version_info
(2, 5, 2, 'final', 0)
# or
>>> sys.hexversion
34014192
Run Code Online (Sandbox Code Playgroud)

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

assert sys.version_info >= (2, 5)
Run Code Online (Sandbox Code Playgroud)

这将比较主要和次要版本信息.加入微(= 0,1等等),甚至releaselevel(= 'alpha','final'等)的元组,只要你喜欢.但请注意,"躲避"检查是否存在某个特征,如果没有,则解决方法(或挽救)几乎总是更好.有时功能会在较新版本中消失,被其他版本取代.

  • 它实际上是print的语法.不是为了检查版本.我在我的python 2和3脚本中使用它:`PY3 = sys.version_info [0] == 3` (34认同)
  • 您还可以访问`sys.version_info`中的某些字段作为属性,因此`PY3 = sys.version_info.major == 3`可能会更具吸引力. (21认同)
  • PY2 = sys.version_info [0] == 2 PY3 = sys.version_info [0] == 3 (4认同)
  • @gcb 只要 Python 4 发生,你的代码片段就会中断。您应该执行“if sys.version_info >= (3,)”。比较不同大小的元组完全是Pythonic,它会做正确的事情。 (4认同)
  • 如果 python 文件使用“-O”或“-OO”运行,则断言将被删除。因此,最好定期进行 if 检查,如果条件不满足则退出程序。 (4认同)

小智 347

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

python -V
Run Code Online (Sandbox Code Playgroud)

这在'man python'中有记载.

  • 资本V是版本,而不是小写 (11认同)
  • 这不是回答问题。 (11认同)
  • @AxelBregnsbo 请注意,`!python -V` 可能会返回与当前运行的 Python 版本不同的版本。 (6认同)

bri*_*anz 95

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

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

>>> import sys
>>> sys.hexversion
33883376
>>> '%x' % sys.hexversion
'20504f0'
>>> sys.hexversion < 0x02060000
True
Run Code Online (Sandbox Code Playgroud)

  • 发布级别定义为'alpha','beta','candidate'或'final'之一,恰好也可以正确比较... (10认同)
  • @sorin:你能解释一下这比Seth的回答更好吗?既然你说这是最好的,我想知道. (6认同)
  • @ 0xC0000022L你有没有想过如何比较元组中的文本?'final'与beta,rc或其他任何东西相比如何?相反,如果您有数字值,您将始终能够指定确切的版本. (3认同)

Set*_*eth 63

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

>>> 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
>>> 
Run Code Online (Sandbox Code Playgroud)

此外,您始终可以在简单的尝试中包装导入,这应该会捕获语法错误.而且,对于@Heikki而言,这段代码将与许多旧版本的python兼容:

>>> try:
...     from my_module import twoPointSixCode
... except Exception: 
...     print "can't import, probably because your python is too old!"
>>>
Run Code Online (Sandbox Code Playgroud)

  • 为什么是普通的Exception而不是ImportError?:P (3认同)
  • @deadly - ImportError不会捕获SyntaxErrors,如果您尝试在旧python中使用新语法,例如尝试使用[快捷条件](https://mail.python.org/pipermail/在2.5之前的python-dev/2005-September/056846.html). (3认同)
  • @Fermiparadox - 广泛性使假设保持较低水平。` except Exception:` 行本身已经假设了一个现代 (2.x+) python。也许未来的Python会以某种向后不兼容的方式重新排列异常名称?(可能不会,但谁知道 20 年后当我们都植入了 oculus rift 眼球植入物时,Python 会是什么样子呢?代码可以保存很长时间。) (2认同)

Bil*_*ill 57

使用platformpython_version从STDLIB:

>>> from platform import python_version
>>> print(python_version())
2.7.8
Run Code Online (Sandbox Code Playgroud)

  • 对于打印功能,在括号中会更好,考虑兼容性.如果有人在版本3中使用示例,则语法错误将在那里等待. (5认同)

rjm*_*nro 46

像这样的东西:

#!/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)
Run Code Online (Sandbox Code Playgroud)

在脚本的顶部.

请注意,根据脚本中的其他内容,比目标更旧的python版本可能无法加载脚本,因此无法报告此错误.作为一种变通方法,您可以在脚本中运行上述内容,该脚本使用更现代的代码导入脚本.

  • 这是不正确的(或者至少是不完整的),因为旧的解释器会对新的语言结构进行barf,例如`x if Pred()else y`.它们将在"lexing"阶段死亡,并且永远不会有机会*执行*`exit(1)`.[Seth的回答](http://stackoverflow.com/questions/3016157/determing-python-version-at-runtime/3016171#3016171)在将新语言功能封装在其他文件中是正确的. (6认同)
  • 我想@MarkRushakoff所说的是,如果你把它放在一个文件的顶部,并且在同一个文件的其他地方有一个新的语言特性,旧的python版本会在加载文件时死掉,在它运行任何文件之前,所以错误不会显示.基本上你必须将上面(或另一个检查)放在文件的顶部,然后从单独的文件中导入需要新版本python的代码. (5认同)
  • @MarkRushakoff:你的评论令人困惑.这个答案的哪个方面是错的?缺少的`else`分支或者```用于`version_info`?AFAIK Python填充元组中的缺失值,所有这些都应该在2.6之前有效,不是吗?所以Seth的答案使用切片(冗余),而这个没有,这使你的评论更加混乱. (2认同)

Wol*_*lph 22

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

python -c "print(__import__('sys').version)"
Run Code Online (Sandbox Code Playgroud)

或者只是主要,次要和微观:

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)
Run Code Online (Sandbox Code Playgroud)


Dzh*_*ang 12

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

import six

if six.PY2:
  # this is python2.x
else:
  # six.PY3
  # this is python3.x
Run Code Online (Sandbox Code Playgroud)


fen*_*aun 8

import sys
sys.version.split(' ')[0]
Run Code Online (Sandbox Code Playgroud)

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


Hei*_*nen 5

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

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

try:
    pass
except:
    pass
finally:
    pass
Run Code Online (Sandbox Code Playgroud)

但是不适用于较旧的Python版本,因为除了OR之外你最终只能匹配try.因此,为了与旧的Python版本兼容,您需要编写:

try:
    try:
        pass
    except:
        pass
finally:
    pass
Run Code Online (Sandbox Code Playgroud)


nor*_*ius 5

几个答案已经建议如何查询当前的 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")
Run Code Online (Sandbox Code Playgroud)