Quand j'utilise pylint:
options = [ filename, "--output-format=json", "--reports=no" # Tells whether to display a full report or only the messages. ]
Ma variable messages
a les informations correctes en JSON
. Cependant, pylint imprime le message JSON
dans la console ...
Comment puis-je empêcher l' print()
de pylint?
Cette option ne fonctionne pas:
import pylint.lint options = [ filename, "--output-format=json" ] results = pylint.lint.Run(options, do_exit=False) messages = results.linter.reporter.messages
voir https://pylint.readthedocs.io/en/stable/technical_reference/features.html#reports-options
5 Réponses :
Le seul moyen que j'ai trouvé est de commenter la ligne:
self.reporter.display_messages(report_nodes.Section())
depuis \ pylint \ lint.py
Vous pouvez facilement utiliser la sortie stdout
capture pour une commande donnée, pour supprimer la sortie imprimée
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
Vous pouvez voir de nombreuses autres approches abordées dans
La seule façon de bien le faire ... est d'utiliser votre ReporterClass
.
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)
Le code ci-dessous a le même comportement que json
mais sa méthode display_messages
ne fait rien
import pylint.lint options = [ filename, "--output-format=mypackage.mymodule.MyReporterClass" ] results = pylint.lint.Run(options, do_exit=False) messages = results.linter.reporter.messages
PyLint ne fera plus print()
après avoir évalué le code.
Le moyen le plus court sera simplement de remplacer la méthode: pylint.lint.reporters.json_reporter.JSONReporter.display_messages = lambda self, layout: None
Vous pouvez également utiliser le CollectingReporter, puis vous convertir vous-même en JSON.
CONSEIL : notez que vous devez désactiver le scoring, sinon CollectingReporter crée une erreur, car il n'a pas de fonction d'affichage.
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
Je me rends compte que c'est une réponse tardive, mais j'ai pensé mentionner qu'il existe une alternative entre le roulement de votre propre journaliste et la redirection de stdout. Malheureusement, ce n'est pas très bien documenté, mais un rapide coup d'œil au code montre que la classe BaseReporter
a une méthode set_output qui semble être conçue exactement pour cela. Donc, une autre approche qui permet la suppression de stdout mais rassemble toujours la sortie JSON (je l'utilise pour les rapports sélectifs) est quelque chose comme ceci:
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)
Ensuite , vous pouvez utiliser results.linter.stats
pour prendre des décisions sur ce qu'il faut signaler (par exemple, les statistiques [ « refactor »] détient le nombre de messages générés réusiner), et vous pouvez imprimer ou ouvrir une session out_stream
comme bon vous semble.
essayez peut-être d'ajouter aux
options
,"--disable=all"