Seite 1 von 1

Python 3.4 - Fehlerkanal mittels subprocess.check_output auslesen

Verfasst: Sonntag 15. Januar 2017, 17:34
von Grendel
Hallo,

ich arbeite an einem GUI-Wrapper für diverse Kommandozeilen-Tools und bin auf eine Schwierigkeit gestoßen, wenn es darum geht, stderr auszulesen.

Zunächst versuchte ich, den Standardfehlerkanal auf stdout umzuleiten und eventuell auftretende Fehler mittels try...except abzufangen. Das funktioniert aber nicht ganz, wie erhofft:

Code: Alles auswählen

try:
	cmd_output = subprocess.check_output(["my_command", my_args], stderr=subprocess.STDOUT)

except subprocess.CalledProcessError as subp_err:
	print(cmd_output)
Der Code ist nur beispielhaft, jedenfalls läuft er im Fehlerfalle in einen "referenced before assignment"-Error, da cmd_output offensichtlich nur lokal für den try-Block gültig ist. Lese ich "subp_err" aus, dann erhalte ich lediglich die von Python generierte Fehlermeldung mit Exit-Code 1. Das Kommandozeilentool schreibt im Falle eines Fehlers aber etwas nach stderr, nur wie komme ich daran?

Gruß,
Andreas

Re: Python 3.4 - Fehlerkanal mittels subprocess.check_output auslesen

Verfasst: Sonntag 15. Januar 2017, 17:44
von Sirius3
@Grendel: cmd_output ist nicht nur lokal im try-Block gültig, sondern erst, wenn die Anweisung auch ausgeführt wurde. Wird sie aber nicht, weil in check_output eine Exception auftritt, und damit vor der Zuweisung in den except-Block gesprungen wird. Du leitest zwar stderr auf stdout, stdout wird aber nicht in eine subprocess.PIPE umgeleitet, so dass die Ausgabe auch nicht in cmd_output, bzw. im Fehlerfall subp_err.output landet.

Re: Python 3.4 - Fehlerkanal mittels subprocess.check_output auslesen

Verfasst: Sonntag 15. Januar 2017, 19:31
von Grendel
@Sirius
Danke für die Erläuterung. Jetzt weiß ich, warum es _nicht_ funktioniert. Aber wie bekomme ich das ans Laufen?

Re: Python 3.4 - Fehlerkanal mittels subprocess.check_output auslesen

Verfasst: Sonntag 15. Januar 2017, 20:03
von Sirius3
@Grendel: war das nicht klar? Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht 3. subp_err ist eine kryptische Abkürzung, die doch gar nicht nötig ist:

Code: Alles auswählen

try:
    cmd_output = subprocess.check_output(
        ["my_command", my_args],
        stdout=subprocess.PIPE,
        stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as processerror:
    print(processerror.output)

Re: Python 3.4 - Fehlerkanal mittels subprocess.check_output auslesen

Verfasst: Montag 16. Januar 2017, 21:04
von Grendel
Ja, so habe ich das probiert. Provoziere ich dann aber einen Fehler in dem so gestarteten Prozess, der dann eine Fehlermeldung nach stderr schreibt, dann erhalte ich diese Fehlermeldung:

ValueError: stdout argument not allowed, it will be overridden.

Edit: ein Blick in "subprocess.py" ergibt dies:

Code: Alles auswählen

    if 'stdout' in kwargs:
        raise ValueError('stdout argument not allowed, it will be overridden.')
Edit2: okay, ich lasse den Teil mit "stdout" einfach weg, dann scheint es zu funktionieren.