程序化调用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
有没有什么提示?除了“复制 __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'])
比如说。