вызывая pylint программно - PullRequest
33 голосов
/ 08 января 2010

Я бы хотел вызвать средство проверки 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 или другое программное обеспечение: не стесняйтесь предлагать альтернативы. спасибо!

Ответы [ 6 ]

23 голосов
/ 14 января 2010

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

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

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

например.

16 голосов
/ 27 октября 2011

Недавно у меня возникла такая же проблема. 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 раза быстрее в моем случае. После этого я прошел весь проект, используя полный вывод для проверки каждого исходного файла, выявления ошибок и ранжирования всех файлов из их заметки.

3 голосов
/ 31 марта 2016

Вместо создания класса 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'))

Источник:

3 голосов
/ 26 января 2011

Я рад, что наткнулся на это. Я использовал некоторые ответы здесь и некоторую инициативу, чтобы придумать:

# 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"]

1 голос
/ 29 июня 2017

Другой точкой входа для 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 из API и pylint из CLI не используют одинаковые параметры по умолчанию. Таким образом, вам просто нужно указать параметры, которые вам нужны.

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 выполнит сам синтаксический анализ и правильно выведет ожидаемые результаты в стандартный вывод.

0 голосов
/ 07 июня 2019

Примечание: В какой-то момент pylint изменил интерфейс. Приведенные выше примеры необходимо заменить exit=False на do_exit=False. (@ mad7777, @ amit-tripathi)

(Изучено согласно https://github.com/carsongee/pytest-pylint/issues/80)

...