Senden einer komplexen cmd Zeichenfolge aus einem vollständigen Dateipfad zu einer ausführbaren Datei, die mehrere Flags, Argumente, Parameter, Ein- und Ausgänge scheint mich shell = True sonst subprocess.Popen setzen müssen ist nicht in der Lage, etwas Komplexeres als nur einen einfachen Pfad zur ausführbaren Datei zu verstehen (ohne Leerzeichen in einem Dateipfad).Pythons Subprozess.Popen mit Shell = True. Warten Sie, bis es abgeschlossen ist
In meinem Beispiel habe ich eine ziemlich lange cmd:
cmd = " '/Application/MyApp.app/Contents/MacOS/my_executable' '/Path/to/input/files' -some -flags -here -could -be -a -lot '/full/path/to/output/files' "
Einreichen dieses cmd zu subprocess.Popen "Ergebnissen zu einem Fehler, der auf etwas über den Weg beschwert und nicht in der Lage, es zu finden.
So anstelle von:
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
check_call scheint Arbeiten recht gut:
proc = subprocess.check_call(cmd, shell=True)
Interessant, erst nach Schal zu Wahren
shell=True
die subprocess.check_call arbeitet mit einem mitgelieferten cmd gesetzt.
Der Nebeneffekt ist, dass der Rest des Codes läuft scheint ohne zu warten subprocess.check_call (cmd, shell = True) zuerst zu beenden.
Der Code ist so konzipiert, dass der Rest der Ausführung von einem Ergebnis von subprocess.check_call(cmd, shell=True)
abhängig ist.
Ich frage mich, ob es sowieso gibt, um die Ausführung des Codes zu erzwingen zu warten, bis subprocess.check_call (Cmd, Shell = True) abgeschlossen ist. Danke im Voraus!
Haben Sie versucht, 'cmd' in eine Liste umzuwandeln, wenn Sie mit' shell = False' und 'subprocess.Popen' laufen? Sie können dazu die 'shlex.split()' -Funktion verwenden, wie im Beispiel-Code in der [Dokumentation des Popen-Konstruktors] (http://docs.python.org/2/library/subprocess.html#) Popen-Konstruktor). – miikkas