如果我的Python脚本至少需要特定版本的Python,那么在使用早期版本的Python启动脚本时,正确失败的正确方法是什么?
如何及早获得控制权以发出错误消息并退出?
例如,我有一个使用ternery操作符(2.5中的新增内容)和"with"块(2.6中的新增内容)的程序.我写了一个简单的小解释器 - 版本检查器例程,这是脚本会调用的第一件事......除了它没有那么远.相反,在我的例程被调用之前,脚本在python编译期间失败.因此,脚本的用户会看到一些非常模糊的synax错误回溯 - 这几乎需要专家推断它只是运行错误版本的Python的情况.
我知道如何检查Python的版本.问题是某些语法在旧版本的Python中是非法的.考虑这个程序:
import sys if sys.version_info < (2, 4): raise "must use python 2.5 or greater" else: # syntax error in 2.4, ok in 2.5 x = 1 if True else 2 print x
在2.4下运行时,我想要这个结果
$ ~/bin/python2.4 tern.py must use python 2.5 or greater
而不是这个结果:
$ ~/bin/python2.4 tern.py File "tern.py", line 5 x = 1 if True else 2 ^ SyntaxError: invalid syntax
(引导同事.)
你可以测试使用eval
:
try: eval("1 if True else 2") except SyntaxError: # doesn't have ternary
另外,with
是可以在Python 2.5,只需添加from __future__ import with_statement
.
编辑:为了尽早获得控制权,您可以将其拆分为不同的.py
文件,并在导入之前检查主文件中的兼容性(例如,__init__.py
在包中):
# __init__.py # Check compatibility try: eval("1 if True else 2") except SyntaxError: raise ImportError("requires ternary support") # import from another module from impl import *
有一个程序包装程序,执行以下操作.
import sys req_version = (2,5) cur_version = sys.version_info if cur_version >= req_version: import myApp myApp.run() else: print "Your Python interpreter is too old. Please consider upgrading."
sys.version()
如果您计划遇到使用2.0之前的Python解释器的人,您也可以考虑使用,但是您可以使用一些正则表达式.
并且可能有更优雅的方法来做到这一点.
尝试
import platform platform.python_version()
应该给你一个像"2.3.1"的字符串.如果这不是您想要的,那么通过"平台"内置提供了丰富的数据集.你想要的应该在某个地方.
可能最好的方法做这个版本比较是使用sys.hexversion
.这很重要,因为比较版本元组不会在所有python版本中提供所需的结果.
import sys if sys.hexversion < 0x02060000: print "yep!" else: print "oops!"
import sys # prints whether python is version 3 or not python_version = sys.version_info.major if python_version == 3: print("is python 3") else: print("not python 3")
来自AskUbuntu的Nykakin的回答:
您还可以使用platform
标准库中的模块从代码本身检查Python版本.
有两个功能:
platform.python_version()
(返回字符串).
platform.python_version_tuple()
(返回元组).
创建例如文件:
version.py
)
检查版本的简便方法:
import platform print(platform.python_version()) print(platform.python_version_tuple())
您还可以使用以下eval
方法:
try: eval("1 if True else 2") except SyntaxError: raise ImportError("requires ternary support")
在命令行中运行Python文件:
$ python version.py 2.7.11 ('2', '7', '11')
通过Windows 10上的WAMP服务器使用CGI输出Python:
https://askubuntu.com/questions/505081/what-version-of-python-do-i-have
集合成为Python 2.4核心语言的一部分,以保持向后兼容.那时我做了这个,这对你也有用:
if sys.version_info < (2, 4): from sets import Set as set
虽然问题是: 如何及早获得控制权以发出错误消息并退出?
我回答的问题是: 如何在启动应用程序之前及早获得控制权以发出错误消息?
我能以与其他帖子不同的方式回答它.到目前为止,似乎答案是试图从Python中解决您的问题.
我说,在启动Python之前进行版本检查.我看到你的路径是Linux或unix.但是,我只能为您提供Windows脚本.我将图像调整为linux脚本语法并不会太难.
这是版本为2.7的DOS脚本:
@ECHO OFF REM see http://ss64.com/nt/for_f.html FOR /F "tokens=1,2" %%G IN ('"python.exe -V 2>&1"') DO ECHO %%H | find "2.7" > Nul IF NOT ErrorLevel 1 GOTO Python27 ECHO must use python2.7 or greater GOTO EOF :Python27 python.exe tern.py GOTO EOF :EOF
这不会运行应用程序的任何部分,因此不会引发Python异常.它不会创建任何临时文件或添加任何OS环境变量.由于版本语法规则不同,它不会将您的应用程序结束为异常.这是三个不太可能的访问安全点.
这FOR /F
条线是关键.
FOR /F "tokens=1,2" %%G IN ('"python.exe -V 2>&1"') DO ECHO %%H | find "2.7" > Nul
对于多个python版本检查检查URL:http://www.fpschultze.de/modules/smartfaq/faq.php? faqid = 17
我的黑客版本:
[MS脚本; Python版本检查预发布的Python模块] http://pastebin.com/aAuJ91FQ