Seite 1 von 1

Ausgabe von flake8 in String umleiten?

Verfasst: Mittwoch 5. Juni 2013, 13:57
von t7l
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.?

Re: Ausgabe von flake8 in String umleiten?

Verfasst: Mittwoch 5. Juni 2013, 14:17
von 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()`.

Re: Ausgabe von flake8 in String umleiten?

Verfasst: Mittwoch 5. Juni 2013, 15:20
von t7l
@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?

Re: Ausgabe von flake8 in String umleiten?

Verfasst: Freitag 7. Juni 2013, 08:43
von 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.