программный вызов pylint

Я хотел бы вызвать средство проверки pylint, ограниченное частью сигнализации об ошибке, как часть моего модульного тестирования. поэтому я проверил исполняемый скрипт pylint, попал в pylint.lint.Run помощника pylint.lint.Run и там я потерялся в довольно длительной функции __init__ , заканчивая вызовом sys.exit() .

кто-нибудь когда-либо пробовал и сумел это сделать?

  • Как прокручивать веб-страницу с помощью selenium webdriver в python?
  • план мечты был бы следующим:

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

    любые подсказки? кроме «скопировать метод __init__ и пропустить sys.exit() », я имею в виду?

    Я не нуждаюсь в тестах, которые будут выполняться pylint , это может быть также и pyflakes или другое программное обеспечение: не стесняйтесь предлагать альтернативы. благодаря!

  • Открыт файл: этот плохой стиль Python?
  • Как настроить PyLint, чтобы проверить все проверки PEP8?
  • Асимметричное поведение для __getattr__, newstyle vs oldstyle classes
  • Идиома для распаковки длинной кортежей
  • PEP 8, почему нет пробелов вокруг «=» в аргументе ключевого слова или значения параметра по умолчанию?
  • вопрос о дескрипторе файла python
  • 5 Solutions collect form web for “программный вызов pylint”

    Взгляните на pylint/epylint.py который содержит два разных способа запуска программы pintint.

    Вы также можете просто позвонить:

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

    например.

    В последнее время у меня такая же проблема. 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... 

    что примерно в 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) 

    Арги в приведенном выше списке представляют собой список строк, например. ["-r", "n", "myfile.py"]

    Вместо создания класса WritableObject мы можем использовать StringIO. 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')) 

    Источник:

    • Ответ @cdarke

    • Ответ @ mad7777

    Другой точкой входа для pylint является функция epylint.py_run , которая реализует перехват stdout и stderr. Однако, как показано в следующем коде, pylint, кажется, не записывает свои отчеты в stdout:

     from pylint import epylint pylint_stdout, pylint_stderr = epylint.py_run(__file__, return_std=True) print(pylint_stdout.getvalue()) # -> there is just the final rank, no report nor message print(pylint_stderr.getvalue()) 

    Теперь я обнаружил, что pylint из CLI и pylint из CLI не использует те же параметры по умолчанию. Таким образом, вам просто нужно предоставить параметры, необходимые для pylint.

     from pylint import epylint options = '--enable=all' # all messages will be shown options += '--reports=y' # also print the reports (ascii tables at the end) pylint_stdout, pylint_stderr = epylint.py_run(__file__ + ' ' + options, return_std=True) print(pylint_stdout.getvalue()) print(pylint_stderr.getvalue()) 

    Как описано здесь , pylint будет выполнять синтаксический анализ и правильно выводит ожидаемые результаты в stdout.

    Python - лучший язык программирования в мире.