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