以编程方式调用pylint

mar*_*omo 33 python automated-tests coding-style pylint

作为单元测试的一部分,我想调用限制在错误信号部分的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
Run Code Online (Sandbox Code Playgroud)

任何提示?除了"复制__init__方法并跳过sys.exit()",我的意思是?

我并不需要通过运行测试pylint,它也可能是pyflakes或其他软件:随时提出替代方案.谢谢!

小智 24

看看pylint/epylint.py包含两种不同的方式以编程方式启动pylint.

你也可以简单地打电话:

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

例如.

  • 为什么这种方法在刑事犯罪上如此无证?有完整的返回值和选项,但我在网上找不到任何文档!:-( (4认同)

小智 17

我最近遇到了同样的问题.syt是对的,pylint.epylint那里有几种方法.然而,它们都调用了再次启动python的子进程.在我的情况下,这变得非常缓慢.

从mcarans回答建立并发现有一个标志出口,我做了以下

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...
Run Code Online (Sandbox Code Playgroud)

这在我的情况下快了约3倍.有了这个,我一直在经历一个完整的项目,使用完整的输出来检查每个源文件,指出错误,并从他们的笔记中排序所有文件.


Ami*_*thi 5

我们可以使用 StringIO,而不是创建 WritableObject 类。StringIO 包含 write 方法。

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'))
Run Code Online (Sandbox Code Playgroud)

来源: