2017-07-03 3 views
0

Ich verwende unten Code für die Ausgabe von Shell-Befehl.subprocess.CalledProcessError gibt keine Fehlermeldung

import subprocess 
exitcode, err, out = 0, None, None 
try: 
    out = subprocess.check_output(cmd, shell=True, universal_newlines=True) 
except subprocess.CalledProcessError as e: 
    exitcode, err = e.returncode, e.output 

print("x{} e{} o{}".format(exitcode, err, out)) 

Wenn ein gültiger Befehl zum cmd wie echo hello wird übergeben, das Programm gut läuft und gibt Ausgang als (0, None, "hello\n")

Aber wenn ich eine falsche Art von Befehl gebe ich die Fehlermeldung erwarten kommen sollte, in err, aber es wird direkt gedruckt. Zum Beispiel, wenn ich pass ls -lrt foo in cmd die Ausgabe kommt als

[email protected]> python mytest.py 
ls: cannot access foo: No such file or directory 
x2 e oNone 

Deshalb möchte ich ls: cannot access foo: No such file or directory in err kommen sollte. Wie geht das?

Antwort

2

Um die Fehlerausgabe zu erfassen, müssen Sie ein anderes Argument an die subprocess.check_output()-Funktion übergeben. Sie müssen stderr=subprocess.STDOUT einstellen. Dadurch wird der stderr-Ausgang auf e.output geleitet.

subprocess.check_output() ist ein Wrapper über subprocess.run(). Es erleichtert unser Leben, indem es einige vernünftige Vorgaben eingibt. Einer davon macht stdout=subprocess.PIPE. Dies leitet die Standardausgabe des Befehls, den Sie ausführen, an Ihr Programm zurück. In ähnlicher Weise können Sie die Standardfehlerausgabe an Ihr Programm übergeben, indem Sie das Argument stderr=subprocess.PIPE übergeben. Dadurch wird e.stderr ausgefüllt, wobei e die Ausnahme ist.

Lassen Sie mich wissen, wenn das nicht klar ist.

Verwandte Themen