Python3:在语法分析之前检查版本
在解析整个文件之前,我想检查我的解释器是否使用Python3来打印一条合适的错误消息,否则 在中,有一个关于Python 2.4/2.5的答案。然而,当我试图在Python2.7/3.3环境中重现该解决方案时,它不起作用 例如,运行以下文件:Python3:在语法分析之前检查版本,python,python-2.7,python-3.x,Python,Python 2.7,Python 3.x,在解析整个文件之前,我想检查我的解释器是否使用Python3来打印一条合适的错误消息,否则 在中,有一个关于Python 2.4/2.5的答案。然而,当我试图在Python2.7/3.3环境中重现该解决方案时,它不起作用 例如,运行以下文件: try: eval("print('', end='')") except SyntaxError: raise Exception("python 3 needed") print("", end="") 导致以下错误: File "test
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行
这里还有其他可能的破解方法吗?使用
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和Python 3上运行的Python代码是完全可行的。检查运行脚本的Python版本的经典方法是使用sys.version_info()返回的元组:
from\uuuuu future\uuuuu导入打印功能
导入系统
如果系统版本信息[0]<3:
打印(“此程序需要Python 3.2版或更高版本”)
系统出口(1)
通过从
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu导入将print()
作为函数启用的原因是,如果使用print
语句,脚本将无法在Python3.x下进行解析。此处发布的代码也无法在Python2.4或2.5上运行;您正在使用print()
作为代码中的函数,因此编译器仍将抛出异常。将print()
use移出此模块,移动到一个单独的模块中。我需要的正是from\uuuuuu future\uuuuu导入print\u函数。我无法添加另一个“主”文件来替换当前文件,但我可以添加导入,然后测试版本,不会出现错误。您能解释一下您的答案吗?@EvertonAgner使用sys。version\u info
将为您提供有关您正在使用的Python版本的信息。这是您如何确定您是否正在使用所需的版本的方法-作为一般提示。
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)