如何在运行之前检查python代码的语法错误

时间:2014-02-13 07:35:16

标签: python syntax-error

我正在开发一个工具,它必须接受一个文件作为输入,检查语法错误,编译它并在那之后做一些事情。

例如, 我有一个文件run.py:

a=5
b=c
print b

这应该在编译时清楚地显示语法错误,因为' c'未定义

我尝试使用

try:
    py_compile.compile("source_program/run.py", doraise=True)
    print "Compiled"
except:
    print "Error while compiling"

我得到输出" Compiled"在编译"

时,而不是"错误

如果我将run.py文件修改为:

a=5
b=c/  #Instead of b=c
print b

然后我在编译"

时得到输出"错误

在第一种情况下,我没有收到错误消息?

3 个答案:

答案 0 :(得分:9)

这不是语法错误。 b=c是完全有效的语法,无论c是否存在。事实上,其他一些模块可以做到

import __builtin__
__builtin__.c = 3

在这种情况下,会有一个内置的c变量,其值为3,可供所有模块使用,并且您的代码运行正常。

对于病态较少的病例,如果文件包含*导入,例如

from numpy import *

导入会将一大堆名称转储到模块的全局命名空间中,并且无法确定这些名称是什么。即使没有import *,Python也无法确定在编译时对未知名称的引用是错误。

如果要检测此类语义错误,则需要对程序进行更复杂的分析。与NPE建议的pylint之类的现有linter集成,可能比编写自己的工具更有效率。如果你真的想自己做,你可以用ast.parse解析代码并检查AST,逐个语句来查看哪些变量存在于哪些点。你仍然永远不会捕获所有的bug,但你会发现很多。

答案 1 :(得分:4)

由于很多原因,这是一个棘手的问题。

尝试与pylint集成而不是试图提出自己的想法可能不是一个坏主意。

答案 2 :(得分:2)

c未定义实际上不是编译时错误。 Python在运行时只会在运行时遇到未定义变量的问题。这不是任何Python编译器都能捕获的东西。