【问题标题】:Pylint: how to prevent printsPylint:如何防止打印
【发布时间】:2019-03-25 16:50:28
【问题描述】:

当我使用 pylint 时:

import pylint.lint
options = [
    filename, 
    "--output-format=json"
]
results = pylint.lint.Run(options, do_exit=False)
messages = results.linter.reporter.messages

我的messages 变量的正确信息为JSON。 但是,pylint 在控制台中打印 JSON 消息...

如何防止 pylint 的print()

此选项不起作用:

options = [
    filename, 
    "--output-format=json",
    "--reports=no"    # Tells whether to display a full report or only the messages.
]

https://pylint.readthedocs.io/en/stable/technical_reference/features.html#reports-options

【问题讨论】:

  • 也许可以尝试添加到options, "--disable=all"

标签: python python-3.x pylint


【解决方案1】:

做好这件事的唯一方法... 是使用你的ReporterClass

import pylint.lint
options = [
    filename, 
    "--output-format=mypackage.mymodule.MyReporterClass" 
]
results = pylint.lint.Run(options, do_exit=False)
messages = results.linter.reporter.messages

下面的代码与json 具有相同的行为,但它的display_messages 方法什么也不做

import html
from pylint.interfaces import IReporter
from pylint.reporters import *

class MyReporterClass(BaseReporter):
    """Report messages and layouts."""

    __implements__ = IReporter
    name = "myreporter"
    extension = "myreporter"

    def __init__(self, output=sys.stdout):
        BaseReporter.__init__(self, output)
        self.messages = []

    def handle_message(self, msg):
        """Manage message of different type and in the context of path."""
        self.messages.append(
            {
                "type": msg.category,
                "module": msg.module,
                "obj": msg.obj,
                "line": msg.line,
                "column": msg.column,
                "path": msg.path,
                "symbol": msg.symbol,
                "message": html.escape(msg.msg or "", quote=False),
                "message-id": msg.msg_id,
            }
        )

    def display_messages(self, layout):
        """Do nothing."""

    def display_reports(self, layout):
        """Do nothing."""

    def _display(self, layout):
        """Do nothing."""


def register(linter):
    """Register the reporter classes with the linter."""
    linter.register_reporter(MyReporterClass)

在评估代码后,PyLint 将不再执行print()

【讨论】:

  • 更短的方法就是重写方法:pylint.lint.reporters.json_reporter.JSONReporter.display_messages = lambda self, layout: None
【解决方案2】:

我找到的唯一方法是注释掉该行:

self.reporter.display_messages(report_nodes.Section())

来自 \pylint\lint.py

【讨论】:

    【解决方案3】:

    您可以轻松地对给定命令使用捕获 stdout 来抑制打印输出

    import pylint.lint
    filename = "server.py"
    options = [
        filename,
        "--output-format=json"
    ]
    
    import contextlib
    @contextlib.contextmanager
    def capture():
        import sys
        from io import StringIO
        oldout,olderr = sys.stdout, sys.stderr
        try:
            out=[StringIO(), StringIO()]
            sys.stdout,sys.stderr = out
            yield out
        finally:
            sys.stdout,sys.stderr = oldout, olderr
            out[0] = out[0].getvalue()
            out[1] = out[1].getvalue()
    
    with capture() as out:
        results = pylint.lint.Run(options, do_exit=False)
    messages = results.linter.reporter.messages
    

    您可以在

    中看到许多其他方法

    Capture stdout from a script in Python

    【讨论】:

      【解决方案4】:

      您也可以使用 CollectingReporter,然后自己转换为 JSON。

      提示:请注意,您需要禁用评分,否则 CollectingReporter 会产生错误,因为它没有显示功能。

      from pylint.reporters import CollectingReporter
      from pylint.lint import Run
      rep = CollectingReporter()
      Run([filename, "-sn"], reporter=rep, do_exit=False)
      # Now continue processing rep.messages
      

      【讨论】:

      • 谢谢,禁用评分正是我正在寻找的提示!
      【解决方案5】:

      我意识到这是一个迟到的答案,但我想我会提到在滚动你自己的记者和重定向标准输出之间有另一种选择。不幸的是,它的文档记录不是很好,但是快速浏览一下代码就会发现BaseReporter 类有一个set_output 方法,似乎正是为此而设计的。因此,另一种允许抑制标准输出但仍收集 JSON 输出(我将其用于选择性报告)的方法是这样的:

      from io import StringIO
      import pylint.lint
      from pylint.reporters import JSONReporter
      
      out_stream = StringIO()
      quiet_reporter = JSONReporter()
      quiet_reporter.set_output(out_stream)
      
      results = pylint.lint.Run([filename], reporter=quiet_reporter, do_exit=False)
      

      然后您可以使用results.linter.stats 来决定要报告的内容(例如,stats['refactor'] 保存生成的重构消息的数量),并且您可以根据需要打印或记录out_stream

      【讨论】:

        猜你喜欢
        • 2014-12-09
        • 2010-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多