检查python代码是否存在错误

检查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

我可以通过一些库检查python文件或模块是否有错误,如:pylint、pychecker、pyflakes等。在大多数情况下,我必须指定要检查的文件或目录。例如:

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)