我想在解析整个文件之前检查我的解释器是否使用Python 3,,否则打印一个不错的错误消息。
在this question中,有一个关于Python 2.4 / 2.5的答案。但是,当我尝试在我的Python 2.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行。
还有其他黑客可以在这里工作吗?
答案 0 :(得分:2)
检查运行脚本的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
语句,脚本将无法在Python 3.x下解析。
答案 1 :(得分:1)
使用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()
也可以在Python 2中运行。编写在Python 2和3上运行的Python代码是完全可行的。如果小心的话。