Python 3:在语法分析之前检查版本

时间:2014-02-10 10:29:00

标签: python python-2.7 python-3.x

我想在解析整个文件之前检查我的解释器是否使用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行。

还有其他黑客可以在这里工作吗?

2 个答案:

答案 0 :(得分:2)

检查运行脚本的Python版本的经典方法是使用sys.version_infohttp://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代码是完全可行的。如果小心的话。