Innerhalb eines subprocess Anruf hängen, möchte ich Shell verwenden = True, so dass es auf Pfadnamen (Code unten) ist Globbing jedoch this has the annoying side-effect of making subprocess
spawn a child process (die dann sein muss, `communicate() d/poll() ed/wait() ed/beende() d/kill() ed/whatevah).Correct Beschwörung von subprocess mit Shell = True Ausgabe zu erhalten und nicht
(Ja, ich bin der Globbing bewusst auch mit fnmatch/glob getan werden kann, aber zeigen Sie mir bitte die ‚richtige‘ Verwendung von subprocess auf diesem, dh die minimale Beschwörung, um sowohl die stdout bekommen und das Kind Prozess zu stoppen.)
Dieses funktioniert gut (liefert Ausgabe):
subprocess.check_output(['/usr/bin/wc','-l','[A-Z]*/[A-Z]*.F*'], shell=False)
aber dies hängt
subprocess.check_output(['/usr/bin/wc','-l','[A-Z]*/[A-Z]*.F*'], shell=True)
(PS: Es ist erschwerenden ernst, dass man nicht sagen kann, subprocess Sie einige aber nicht alle Shell Funktionalität z.B. globbing, aber nicht laichen. Ich denke, es ist ein würdiger PEP, dass, wenn jemand einen Kommentar kümmert, übergeben, dh in einem Tupel von Booleschen oder ein oder von Binärflags)
(PPS: das Idiom, ob Sie subprocess...(cmdstring.split() or [...])
Pass ist nur Ein trivialer idiomatischer Unterschied. Ich sage tomate, du sagst tomay-to. In meinem Fall ist die Motivation, dass der Befehl behoben ist, aber ich möchte es mehr als einmal mit einer anderen Dateispezifikation aufrufen.)
Wie würden Sie dem zugrunde liegenden _shell_ sagen, dass Sie nur einige, aber nicht alle Funktionen haben wollen?Bis die zugrunde liegende Shell dies unterstützt (über ein weites Array von Plattformen), gibt es nicht viel Unterstützung für eine API, um darauf zuzugreifen ... –
@Charles: Ich habe nicht gesagt Shell sagen. Ich sagte ***, Unterprozess *** zu erzählen. Subprozess kann mit Calls zu fnmatch anstelle von ausgewachsener Shell vortäuschen, ich gebe wirklich keinen Laut von sich, wie er es erreicht. Aber das ist machbar, wenn es schmerzhaft ist. – smci
Ich habe 'shell = True' gelesen, um zu sagen, dass ich eine tatsächliche UNIX-Shell aufrufen möchte. Wenn Sie plötzlich 'subprocess' * faking * als eine Shell haben, fragen Sie sie, um herauszufinden, was das Richtige (oder zumindest die erwartete Sache) auf der nativen Shell jeder Plattform ist, die Python unterstützt. Denken Sie daran, dass verschiedene Shells unterschiedliche Varianten der Glob-Syntax, verschiedene Formen der Umleitung, verschiedene Flusskontrollkonstrukte (wie sie sicher in One-Linern verwendet werden können, die durch "Subprozess" gestartet werden) unterstützen ... Sie müssten im Grunde ein implementieren tatsächliche UNIX-Shell in Python, und das wäre verrückt. –