程序化调用Pylint

45 投票
10 回答
18001 浏览
提问于 2025-04-15 17:47

我想在我的单元测试中调用 Pylint 检查器,只关注错误提示的部分。所以我查看了 Pylint 的可执行脚本,找到了 pylint.lint.Run 这个辅助类,但在一个很长的 __init__ 函数中迷路了,最后这个函数还调用了 sys.exit()

有没有人尝试过并成功做到这一点?

我理想中的计划是这样的:

if __name__ == '__main__':
  import pylint.lint
  pylint.lint.something(__file__, justerrors=True)
  # now continue with unit testing

有没有什么提示?除了“复制 __init__ 方法并跳过 sys.exit()”之外,我是说?

我并不需要 Pylint 来运行测试,pyflakes 或其他软件也可以:欢迎推荐其他选择。

10 个回答

5

我们可以用StringIO来代替创建一个WritableObject类。StringIO里面有一个写入的方法。

import sys
try:
    from io import StringIO
except:
    from StringIO import StringIO

stdout = sys.stdout
sys.stdout = StringIO()

ARGS = ["-r","n", "--rcfile=rcpylint"]
r = lint.Run(['../test.py']+ARGS, exit=False)

test = sys.stdout.getvalue()
sys.stdout.close()
sys.stdout = stdout

print (test.split('\n'))

来源:

24

我最近也遇到了同样的问题。syt说得对,pylint.epylint里面有几个方法。不过这些方法都会启动一个新的子进程,也就是重新运行Python。在我的情况下,这样做变得相当慢。

根据mcaran的回答,并发现有一个退出的标志,我做了以下操作:

class WritableObject(object):
    "dummy output stream for pylint"
    def __init__(self):
        self.content = []
    def write(self, st):
        "dummy write"
        self.content.append(st)
    def read(self):
        "dummy read"
        return self.content
def run_pylint(filename):
    "run pylint on the given file"
    from pylint import lint
    from pylint.reporters.text import TextReporter
    ARGS = ["-r","n", "--rcfile=rcpylint"]  # put your own here
    pylint_output = WritableObject()
    lint.Run([filename]+ARGS, reporter=TextReporter(pylint_output), exit=False)
    for l in pylint_output.read():
        do what ever you want with l...

这样做在我的情况下快了大约三倍。通过这个方法,我可以遍历整个项目,使用完整的输出检查每个源文件,指出错误,并根据评分对所有文件进行排序。

35

看看这个 pylint/epylint.py 文件,它里面有 两种 不同的方法来以编程的方式启动 Pylint。

你也可以直接调用

from pylint.lint import Run
Run(['--errors-only', 'myfile.py'])

比如说。

撰写回答