2017-08-07 2 views
0

Ich habe den stderr mit dem Subprozessmodul getestet. Wenn ich einen einfachen Test mit Shell = True mit dem Linux-Shell-Befehl ls absichtlich schlecht getippt schreiben:Python: stderr mit Shell = True oder Shell = False im Subprozessmodul

p=subprocess.Popen(["lr"],stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True) 
out, err=p.communicate() 
print ("standard error") 
print(err) 

gibt es die üblichen aus der Schale: lr: command not found.

Aber wenn shell=False, ich verstehe nicht ganz, warum das Programm einen Fehler hat

Traceback (most recent call last): 
    File "importInteresantes.py", line 6, in <module> 
     p=subprocess.Popen(["lr"],stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=False) 
    File "/usr/lib/python2.7/subprocess.py", line 390, in __init__ 
errread, errwrite) 
    File "/usr/lib/python2.7/subprocess.py", line 1024, in _execute_child 
raise child_exception 
OSError: [Errno 2] No such file or directory 

Ausführung dachte ich, dass es mir die gleiche Ausgabe geben würde. Ist der Code falsch oder ist der Standpunkt, dass ich den gleichen stderr erhalten soll?

HINWEIS: Für den Fall, ich habe auch versucht, mit python3

+0

Die Mechanismen zum Starten des Befehls sind in den beiden Fällen sehr unterschiedlich. Warum erwarten Sie genau, dass die Fehlerdiagnose identisch ist? – NPE

+0

"lr: Befehl nicht gefunden" war eine Shell-Fehlermeldung. Wenn Sie keine Shell verwenden, haben Sie keine Shell, um Shell-Fehlermeldungen für Sie anzuzeigen. – jasonharper

+0

Aber was ich erwarte ist, dass das Programm zumindest läuft und dann ein Fehler auftaucht. Nicht dass es überhaupt nicht laufen könnte. Also kannst du nicht für die Fälle wissen, dass ich falschen Befehl mit Python eintippe? Ich habe auch gehört, dass die Verwendung von 'shell = True 'riskant sein kann –

Antwort

1

Mit shell=True, Python startet eine Shell und sagt die Shell lr laufen. Die Shell läuft einwandfrei, findet kein lr Programm und erzeugt eine Fehlerausgabe, die diesen Fehler meldet.

Mit shell=False versucht Python lr direkt auszuführen. Da kein lr Programm ausgeführt wird, kann Python keine ausführbare Datei finden, die lr entspricht. Python kann den Subprozess überhaupt nicht starten, und es gibt keine Stdout- oder Stderr-Streams zum Lesen. Python löst eine Ausnahme aus, die meldet, dass die Datei nicht gefunden wurde.

Dieses Verhalten ist normal und erwartet.

+0

Ok, am Ende denke ich, dass der Fehler innerhalb des Programms es immer unausführbar macht. Danke für die Antworten –

Verwandte Themen