Wie handhabt man Fehler und stderr beim Pipelinen mehrerer Shell-Kommandos mittels subprocess in Python 3?
Verfasst: Montag 22. Januar 2018, 08:33
Hallo,
meine Frage bezieht sich auf das Handhaben von Fehlern und stderr beim Ausführen von mehreren Shell-Kommandos mittels des Moduls "subprocess".
Zu meinem speziellen Fall:
Ich möchte zwei Shell-Kommandos ausführen. Dabei sollen die Kommandos per Pipelining miteinander verbunden werden.
Welche Klassen, Funktionen, etc. aus "subprocess" verwendet werden, spielt eine untergeordnete Rolle. Ich möchte allerdings, dass
Wie aber
Zu meinem (etwas halbherzigen) Versuch:
In der Dokumentation von subprocess.check_output() steht:
Der Code hat folgende Fehler:
AFoeee
meine Frage bezieht sich auf das Handhaben von Fehlern und stderr beim Ausführen von mehreren Shell-Kommandos mittels des Moduls "subprocess".
Zu meinem speziellen Fall:
Ich möchte zwei Shell-Kommandos ausführen. Dabei sollen die Kommandos per Pipelining miteinander verbunden werden.
Welche Klassen, Funktionen, etc. aus "subprocess" verwendet werden, spielt eine untergeordnete Rolle. Ich möchte allerdings, dass
- Stdout ausgelesen werden kann. (das finale Ergebnis)
- dieses Pipelining über Python stattfindet. (also ohne "shell=True" setzen zu müssen)
Code: Alles auswählen
import subprocess
import shlex
# Die Kommandos entsammen ImageMagick
cmd1 = shlex.split("convert -density 300 \"{}\" :-".format(input("> "))
cmd2 = shlex.split("identify -format %wx%h -")
sp = subprocess.Popen(cmd1, stdout=subprocess.PIPE)
result = subprocess.check_output(cmd2, stdin=sp.stdout)
- stelle ich fest ob während der Ausführung irgendeines Kommandos ein Fehler aufgetreten ist?
- handhabe ich stderr der einzelnen Kommandos? (z.B. zum Umlenken in eine Log-Datei)
Zu meinem (etwas halbherzigen) Versuch:
In der Dokumentation von subprocess.check_output() steht:
Daher hatte ich folgendes versucht:The stdout argument is not allowed as it is used internally.
To capture standard error in the result, use stderr=STDOUT.
Code: Alles auswählen
try:
sp = subprocess.Popen(cmd1, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
result = subprocess.check_output(cmd2, stdin=sp.stdout, stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as error:
log(HOW_DO_I_ACCESS_STDOUT?)
finally:
if sp.returncode != 0:
log(sp.stderr.read())
sp.stdout.close()
- Wenn ein "CalledProcessError" auftritt, ist die Variable "result" (in der stdout stehen sollte) nicht definiert. In eben dieser Variablen sollte aber auch stderr enthalten sein, da nach stdout umgelenkt wurde.
- Stdout wird von "subprocess.check_output()" intern verwendet, also darf ich es nicht angeben. Ohne es anzugeben kann ich aber nur über "result" darauf zugreifen?
- sp.stderr.read() wirft auch einen Fehler, weil "sp.stderr" NoneType hat.
AFoeee