在解析整个文件之前,我想检查一下我的解释器是否使用Python 3来打印一个像样的错误消息。
在this question中,有一个关于Python2.4/ 2.5的答案。但是,当我试图在Python2.7/ 3.3环境中再现解决方案时,它没有工作。
例如,运行以下文件:
try:
eval("print('', end='')")
except SyntaxError:
raise Exception("python 3 needed")
print("", end="")
结果出现以下错误:
File "test_version.py", line 6
print("", end="")
^
SyntaxError: invalid syntax
也就是说,eval
的计算速度不够快,无法阻止解析器到达第6行。
还有另一种可能在这里奏效的黑客吗?
发布于 2014-02-10 02:33:42
将使用print()
作为函数的代码移动到一个单独的模块,并使主脚本只进行测试。
在哪个模块中调用print()
函数并不重要,这是一个语法错误,因为您没有使用print
作为语句。您可以将其放在测试后导入的单独模块中。
try:
eval("print('', end='')")
except SyntaxError:
raise Exception("python 3 needed")
import real_script_using_print_function
但是,在Python 2中还可以添加:
from __future__ import print_function
在顶部,使print()
也能在Python2中工作。如果小心的话,编写运行在Python 2和3上的Python代码是完全可行的。
发布于 2014-02-10 08:38:57
检查运行脚本的Python版本的经典方法是使用sys.version_info
(http://docs.python.org/2/library/sys.html)返回的元组:
from __future__ import print_function
import sys
if sys.version_info[0] < 3:
print("This program needs Python version 3.2 or later")
sys.exit(1)
通过从print()
导入__future__
来启用print
函数的原因是,如果使用print
语句,脚本将不会在Python3.x下进行解析。
https://stackoverflow.com/questions/21674621
复制相似问题