Ausgabe von flake8 in String umleiten?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
t7l
User
Beiträge: 5
Registriert: Donnerstag 2. Mai 2013, 14:48
Wohnort: Düsseldorf

Hallo zusammen,

ich möchte die Ausgabe von flake8 in einen String umleiten, um diesen danach weiterverarbeiten zu können.
Über die API-Methode check_file von flake8 bekomme ich die Ausgabe jedoch nur angezeigt, zurückgegeben wird nur die Anzahl der Meldungen.
Ich habe es nun zunächst mittels subprocess wie folgt beispielhaft gelöst:

Code: Alles auswählen

import subprocess

file_to_test = "test.py"

p = subprocess.Popen(["flake8", file_to_test], stdout=subprocess.PIPE)
out, err = p.communicate()
In out habe ich dann die gewünschte Ausgabe.
Meine Frage ist nun: Geht das eleganter bzw. direkt über einen (API)-Aufruf, etc.?
BlackJack

@t7l: Ohne mir die API von `flake8` angeschaut zu haben: Du könntest `sys.stdout` durch ein `io.StringIO`-Exemplar ersetzen für den Aufruf von `check_file()`.
t7l
User
Beiträge: 5
Registriert: Donnerstag 2. Mai 2013, 14:48
Wohnort: Düsseldorf

@BlackJack: Danke! Daran hatte ich nicht gedacht.

Auf die Schnelle komme ich dann auf so etwas, wenn ich 'sys.stdout' danach wiederherstellen möchte:

Code: Alles auswählen

import sys
import flake8.main
from cStringIO import StringIO

def check_file_using_flake8(file_to_test):
    stdout_org = sys.stdout
    sys.stdout = StringIO()
    flake8.main.check_file(file_to_test)
    result = sys.stdout.getvalue()
    sys.stdout = stdout_org
    return result

file_to_test = "test.py"
print check_file_using_flake8(file_to_test)
Insofern hat sich meine Frage eigentlich erledigt, da ich jetzt zwei Möglichkeiten habe, die Ausgabe zu verarbeiten.
Spricht irgendetwas deutlich gegen eine der beiden Möglichkeiten?
BlackJack

@t7l: Ich würde das Rückersetzen in einem ``finally``-Block machen, damit wenn eine Ausnahme auftritt während die Standardausgabe umgelenkt ist, sichergestellt wird, dass die Standardausgabe wieder normal funktioniert.
Antworten