检查python代码是否存在错误
我可以通过一些库检查python文件或模块是否有错误,如:pylint、pychecker、pyflakes等。在大多数情况下,我必须指定要检查的文件或目录。例如:检查python代码是否存在错误,python,pylint,pychecker,Python,Pylint,Pychecker,我可以通过一些库检查python文件或模块是否有错误,如:pylint、pychecker、pyflakes等。在大多数情况下,我必须指定要检查的文件或目录。例如: pylint directory/mymodule.py 没关系,但对我来说还不够。我想分析分离的代码块,并获得所有检测到的错误和警告。所以,作为程序的一部分,我必须从自己的模块调用python代码分析器 import some_magic_checker code = '''import datetime; print(dat
pylint directory/mymodule.py
没关系,但对我来说还不够。我想分析分离的代码块,并获得所有检测到的错误和警告。所以,作为程序的一部分,我必须从自己的模块调用python代码分析器
import some_magic_checker
code = '''import datetime; print(datime.datime.now)'''
errors = some_magic_checker(code)
if len(errors) == 0:
exec(code) # code has no errors, I can execute its
else:
print(errors) # display info about detected errors
是否存在一些python库,如pylint或pyflakes,它们提供了python代码检查功能,而无需编译代码?谢谢你的帮助
UPD 我将试图解释我在这个简单的例子中的意思。我有一个变量“codeString”,它包含python源代码。我必须分析这段代码(没有任何文件创建和代码执行,但我可以编译代码),并检测关于错误代码块的所有警告。让我们看看pyflakes模块内部,了解它是如何工作的 模块“pyflakes.api”中有一个函数“check” 您可以看到,此函数不能仅使用一个参数“codeString”,我们还必须提供第二个参数“filename”。这是我最大的问题,我没有任何文件,只有字符串变量中的Python代码 pylint、pychecker、pyflakes和所有库,据我所知,只适用于创建的文件。因此,我试图找到一些不需要链接到Python文件的解决方案。内置函数“compile”允许创建编译代码或AST对象,并在不创建文件和执行代码的情况下捕获一些错误。我们必须将
'
值作为第二个参数传递,因为代码不是从文件中读取的
>>> def execute(code_string):
>>> output = list()
>>> try:
>>> tree = compile(code_string, '<string>', 'exec')
>>> except Exception as e:
>>> print(e)
>>> else:
>>> exec(tree)
>>> # Now I can check code before calling the "exec" function
>>> code_string = 'print("Hello_World!")'
>>> execute(code_string) # All is ok
Hello_World!
>>> code_string = 'ERROR! print("Hello_World!")'
>>> execute(code_string) # This code will not executed
invalid syntax (<string>, line 1)
def execute(代码字符串):
>>>输出=列表()
>>>尝试:
>>>tree=compile(代码字符串,,'exec')
>>>例外情况除外,如e:
>>>打印(e)
>>>其他:
>>>执行主任(树)
>>>#现在我可以在调用“exec”函数之前检查代码
>>>code_string='print(“Hello_World!”)'
>>>执行(代码字符串)#一切正常
世界你好!
>>>代码字符串='错误!打印(“你好,世界!”)
>>>执行(代码字符串)#此代码将不会执行
无效语法(,第1行)
pyflakes不编译任何代码。为什么代码编译很重要?通常,检测错误和警告的唯一方法是执行大量编译工作。def some_magic_checker(代码):将代码存储在tmp文件中;跑各种跳棋;返回抓取的错误?我可以理解您不希望执行,但编译与执行不同。只要你的模块没有副作用,你可以通过打开python交互控制台并导入它来编译代码。我理解你想做什么——尽管我仍然不知道为什么,但撇开它不谈——你能不能不使用compile函数——相对容易用。
>>> def execute(code_string):
>>> output = list()
>>> try:
>>> tree = compile(code_string, '<string>', 'exec')
>>> except Exception as e:
>>> print(e)
>>> else:
>>> exec(tree)
>>> # Now I can check code before calling the "exec" function
>>> code_string = 'print("Hello_World!")'
>>> execute(code_string) # All is ok
Hello_World!
>>> code_string = 'ERROR! print("Hello_World!")'
>>> execute(code_string) # This code will not executed
invalid syntax (<string>, line 1)