43

単体テストの一環として、エラー シグナル部分に限定された 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。または他のソフトウェアで実行することもできます。代替案を自由に提案してください。

4

8 に答える 8

34

プログラムで Pylint を起動する2 つのpylint/epylint.py異なる方法を含むファイルを見てください。

単に呼び出すこともできます

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

例えば。

于 2010-01-14T07:03:31.433 に答える
22

最近同じ問題が発生しました。その通りです。そこに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...

私の場合、これは約3倍高速です。これで、私はプロジェクト全体を調べ、完全な出力を使用して各ソース ファイルをチェックし、エラーを指摘し、メモからすべてのファイルをランク付けしました。

于 2011-10-27T17:06:39.383 に答える
4

WritableObject クラスを作成する代わりに、StringIO を使用できます。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'))

ソース:

于 2016-03-31T12:41:38.970 に答える
3

これに出会えてよかったです。ここでの回答のいくつかと、いくつかのイニシアチブを使用して考え出しました。

# a simple class with a write method
class WritableObject:
    def __init__(self):
        self.content = []
    def write(self, string):
        self.content.append(string)
pylint_output = WritableObject()

pylint = lint.Run(args, reporter=ParseableTextReporter(pylint_output), exit=False)

上記の Args は文字列のリストです。[「-r」、「n」、「myfile.py」]

于 2011-01-26T10:27:01.970 に答える