[PYTHON] Zeigen Sie nach und nach die Ausgabe des Befehls an, der von subprocess.Popen ausgeführt wird

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

  1. Wenn Sie einen Stream mit "io.open" erstellen, müssen Sie den Dateipfad oder den Dateideskriptor angeben (der mit "(Dateiobjekt) .fileno ()" abgerufen werden kann). Ich kenne den Pfadnamen von "subprocess.Popen.stdout" nicht, daher muss ich ihm einen Dateideskriptor geben. Beachten Sie, dass wir das Dateiobjekt (= 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]
  1. Wenn Sie einen Stream mit "io.open" erstellen, müssen Sie "closefd = False" angeben. Der Standardwert ist "closefd = True". In diesem Zustand tritt der folgende Fehler auf.
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

Zeigen Sie nach und nach die Ausgabe des Befehls an, der von subprocess.Popen ausgeführt wird
Lesen Sie die Ausgabe von subprocess.Popen in Echtzeit
Filtern Sie die Ausgabe von tracemalloc
Ausgabe Debug-Ausgabe des Kelchbefehls
Speichern Sie die Ausgabe von GAN nacheinander ~ Mit der Implementierung von GAN durch PyTorch ~
Der Standardstil (CSS) von Pandas-Datenrahmen, die von der Anzeige in Google Colab ausgegeben werden, wurde geändert
[Python] Zeigt nur die Elemente der Liste nebeneinander an [Vertikal, horizontal]
Lesen Sie die Standardausgabe eines Unterprozesses zeilenweise in Python
Lassen Sie Python die Befehlsausgabe lesen
So geben Sie das Ausgabeergebnis des Linux-Befehls man in eine Datei aus
[Linux] Ein Befehl zum Abrufen einer Liste der in der Vergangenheit ausgeführten Befehle
Zeigen Sie das Diagramm von tensorBoard auf jupyter an
Migemo-Version des Befehls: find,: mfind
Pandas des Anfängers, vom Anfänger, für den Anfänger [Python]
Beachten Sie den Abschluss eines zeitaufwändigen Befehls
Geben Sie den gesamten E-Mail-Text der E-Mail-Gruppe aus, die von Google Mail durchsucht und eingegrenzt wurde
Geben Sie die Anzahl der CPU-Kerne in Python aus
Überprüfen Sie den Betrieb von OpenCV3, das von Anaconda installiert wurde
Zeigen Sie den QR-Code schnell in der Befehlszeile an
Einstellung zur Ausgabe des Protokolls zur Ausführung von cron
Sortieren Sie die Elemente eines Arrays, indem Sie Bedingungen angeben
Anzeige der Ausgabe einer Liste von Gleitkommazahlen
Linux: Benennen Sie den vom Befehl ps angezeigten Prozess um
Die Geschichte des Fehlinterpretierens der Swap-Zeile des obersten Befehls
So löschen Sie die von Python ausgegebenen Zeichen
Linux: Verstehen Sie die Informationen, die vom Befehl top angezeigt werden
Minimieren Sie die Anzahl der Polierungen, indem Sie die Kombination optimieren
Beurteilung des Endes von Mahjong durch Kombinationsoptimierung
Ausgabe in Form eines Python-Arrays
Suchen Sie nach dem Wert der Instanz in der Liste
Rufen Sie den Speicherort der Datei ab, in der sich die Exe befindet, wenn Sie die von PyInstaller erstellte Exe ausführen
Sortieren Sie die aktualisierten Dateien innerhalb des durch den Befehl find angegebenen Zeitraums in der Reihenfolge ihrer Größe
Speichern Sie die Ausgabe der bedingten GAN für jede Klasse ~ Mit der cGAN-Implementierung von PyTorch ~