Ich habe oft die Kommunikationsmethode verwendet, wenn ich externe Befehle mit dem Unterprozessmodul ausgeführt habe.
python:subprocess.Popen.communicate()
import subprocess
(stdoutdata, stderrdata) = subprocess.Popen(['some', 'command'], stdout=subprocess.PIPE).communicate()
print(stdoutdata)
Wenn Sie das Ergebnis jedoch asynchron ausgeben möchten, z. B. ein Build-Skript, können Sie dies nicht mit der Methode "communic" tun. Wie in Bibliotheksreferenz gezeigt, wartet die Methode "communic" bis zum Ende des Prozesses und druckt dann die Standardausgabedaten. Weil ich es zurückgeben werde.
Wenn Sie diese Anforderung erfüllen möchten, müssen Sie das io-Modul verwenden, um einen Stream zu erstellen, der der Ausgabe des untergeordneten Prozesses entspricht.
(ref) http://docs.python.jp/2/library/subprocess.html#subprocess.Popen.stdout (ref) https://gist.github.com/mattbornski/3299031
Stream entsprechend der Ausgabe des untergeordneten Prozesses
def exec_process(commands):
process = subprocess.Popen(commands, stdout=subprocess.PIPE, bufsize=-1)
with io.open(process.stdout.fileno(), closefd=False) as stream:
[print(line.rstrip('\n')) for line in stream]
#Warten Sie bis zum Ende des Prozesses und beurteilen Sie das Ergebnis
process.wait()
if process.returncode != 0:
print('Build process aborts.')
sys.exit(1)
Unten finden Sie einige Punkte, nach denen ich süchtig war
subprocess.Popen.stdout
) nicht so wie es ist angeben.(ref) http://docs.python.jp/2/library/io.html#io.open
python
# process.io stdout.Wenn es direkt zum Öffnen angegeben wird, endet es mit einer Laufzeitausnahme.
def exec_process(commands):
process = subprocess.Popen(commands, stdout=subprocess.PIPE, bufsize=-1)
with io.open(process.stdout, closefd=False) as stream:
[print(line.rstrip('\n')) for line in stream]
close failed in file object destructor:
IOError: [Errno 9] Bad file descriptor
Es wird angenommen, dass die Ursache versucht, das Dateiobjekt (= subprocess.Popen.stdout
) zu schließen, das vom untergeordneten Prozess zum Zeitpunkt des Schließens des Streams (= in diesem Fall beim Beenden der with-Anweisung) gehalten wird.
Recommended Posts