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(=
从命令行(注意大写"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中使用
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) |
使用
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所说,主脚本可以检查
但是您仍然需要注意不要在文件中使用在旧版本的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版本。为了以编程方式检查版本需求,我将使用以下两种方法之一:
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,
1 2 3 | >>> import sys >>> type(sys.version_info) <class 'sys.version_info'> |
我发现使用
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 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.