[PYTHON] Lesen Sie die Ausgabe von subprocess.Popen in Echtzeit

Überblick

Folgen Sie und lesen Sie die Inhaltsausgabe zur Standardausgabe mit subprocess.Popen. Verwenden Sie zu diesem Zeitpunkt readline () zum Lesen jedes Zeilenumbruchs, anstatt readline () zum Lesen (?). Ich mache mir oft Sorgen um den Stream, also mach dir eine Notiz.

Ich habe den Vorgang mit Python 2.7.5 unter CentOS7 bestätigt.

Zeichenausgabeskript

Dies ist das Skript, das von Popen gestartet wird.

textout.py


#!/usr/bin/env python
import sys
import time
for i in range(0, 10):
    sys.stdout.write("[Count {0:04d}]".format(i))
    time.sleep(1)

Ein einfaches Skript, das jede Sekunde "[Count 0000]" druckt. Da es jedoch nicht kaputt geht, kann es nicht von readline () gelesen werden.

Ausführungsskript

Rufen Sie das obige Skript mit Popen auf und lesen Sie die Standardausgabe.

reader.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, os, time, errno, fcntl
from subprocess import Popen, PIPE

#Textout mit Popen.Führen Sie py aus
#Zu dieser Zeit zu Python-Übergeben Sie die Option u, um eine Pufferung zu vermeiden
p = Popen([sys.executable, "-u", "textout.py"], bufsize=0, stdout=PIPE)

# p.Versetzen Sie stdout in den nicht blockierenden Modus
flag = fcntl.fcntl(p.stdout.fileno(), fcntl.F_GETFL)
fcntl.fcntl(p.stdout.fileno(), fcntl.F_SETFL, flag | os.O_NONBLOCK)

while True:
    #Leseschleife
    try:
        # p.Lesen Sie stdout
        #Da es sich um einen nicht blockierenden Modus handelt, lesen Sie so viel wie möglich
        buf = p.stdout.read()
        if buf == "": break   # p.Beenden Sie, wenn stdout geschlossen ist
        sys.stdout.write(buf) #Geben Sie aus, was Sie gelesen haben
        sys.stdout.flush()    #Spülen, da kein Zeilenumbruch vorliegt()
    except IOError, e:
        #IOError, wenn nichts zu lesen ist(11,
        # "Resource temporarily unavailable")Aber
        #Warten Sie, weil es geworfen wird
        if e.errno == errno.EAGAIN:
            time.sleep(0.1)
p.wait()

Ausführungsergebnis

$ ./reader.py
[Count 0000][Count 0001][Count 0002][Count 0003][Count 0004][Count 0005][Count 0006][Count 0007][Count 0008][Count 0009]

[Count 0000] wird jede Sekunde ausgegeben.

Punkt

--Puffern Sie nicht, wenn Sie textout.py oder flush () ausführen, nachdem Sie in sys.stdout geschrieben haben --reader.py liest p.stdout mit read (), also im nicht blockierenden Modus lesen

Recommended Posts

Lesen Sie die Ausgabe von subprocess.Popen in Echtzeit
Lesen Sie die Standardausgabe eines Unterprozesses zeilenweise in Python
Ausgabe in Form eines Python-Arrays
Zeigen Sie nach und nach die Ausgabe des Befehls an, der von subprocess.Popen ausgeführt wird
Geben Sie die Zeit ab dem Start des Programms in Python aus
Holen Sie sich die Standardausgabe in Echtzeit mit dem Python-Unterprozess
Filtern Sie die Ausgabe von tracemalloc
Lesen Sie die Fortran-Ausgabe mit Python
Umfrage zum Einsatz von maschinellem Lernen in realen Diensten
Zusammenfassung der Stolperpunkte in Django zum ersten Mal
Finden Sie die Eigenwerte einer reellen symmetrischen Matrix in Python
Die Geschichte der Teilnahme an AtCoder
Lassen Sie Python die Befehlsausgabe lesen
Verarbeiten Sie das Ergebnis von% time,% timeit
Die Geschichte des "Lochs" in der Akte
Ich habe versucht, den Datenverkehr mit WebSocket in Echtzeit zu beschreiben
Ich habe die Berechnungszeit des in Python geschriebenen gleitenden Durchschnitts verglichen
Lesen Sie das Bild des Puzzlespiels und geben Sie die Reihenfolge der einzelnen Blöcke aus
Geben Sie den Inhalt von ~ .xlsx im Ordner mit Python in HTML aus
Eine Funktion, die die Verarbeitungszeit einer Methode in Python misst
Überprüfen Sie die Komprimierungsrate und -zeit von PIXZ, die in der Praxis verwendet werden
Teil 1 Ich habe die Antwort auf das Referenzproblem geschrieben, wie man in Python in Echtzeit offline schreibt
[Verständnis in 3 Minuten] Der Beginn von Linux
Überprüfen Sie das Verhalten des Zerstörers in Python
Die Geschichte eines Fehlers in PyOCR
Ausgabebaumstruktur von Dateien in Python
Implementieren Sie einen Teil des Prozesses in C ++
Lesen Sie alle CSV-Dateien im Ordner
Das Ergebnis der Installation von Python auf Anaconda
Lesen Sie die Datei Zeile für Zeile mit Python
Lesen Sie die Datei Zeile für Zeile mit Python
MongoDB mit Python zum ersten Mal
Grundlagen zum Ausführen von NoxPlayer in Python
Unterschied in der Ausgabe der Fensterfunktion mit gerader Länge
Konvertierung von Zeitdaten in 25-Uhr-Notation
Lesen Sie den gesamten Inhalt von proc / [pid]
Auf der Suche nach dem schnellsten FizzBuzz in Python
Lesen Sie die Implementierung des globalen ARM-Timers
Holen Sie sich zu jeder Tageszeit eine Datums- / Uhrzeitinstanz in Python
[Python] Lesen Sie die angegebene Zeile in der Datei
[IOS] Ändern Sie die Anzeigezeit für jedes Bild der GIF-Animation in Pythonista3.
Verschiedene Möglichkeiten, die letzte Zeile einer CSV-Datei in Python zu lesen
[Linux] Unterschied in den Zeitinformationen in Abhängigkeit von der Uhr-ID der Funktion clock_gettime ()
Visualisieren Sie Informationen zum Beschleunigungssensor von der Mikrocomputerplatine in Echtzeit mit mbed + Python
So geben Sie mit Jupyter Notebook einen Wert in der Mitte einer Zelle aus
Abrufen der Unix-Zeit der von JST angegebenen Zeit unabhängig von der Zeitzone des Servers mit Python
Ich möchte die Ergebnisse von% time, %% time usw. in einem Objekt (Variable) speichern.
[Python] Lesen Sie den Quellcode von Flasche Teil 2
Bedeutung von {Versionsnummer} im MySQL-RPM-Paket
[Python] Sortieren Sie die Liste von pathlib.Path in natürlicher Reihenfolge
Verkürzung der Analysezeit von Openpose mithilfe von Sound
Ich habe die Implementierung von range gelesen (Objects / rangeobject.c)
Einstellung zur Ausgabe des Protokolls zur Ausführung von cron
Holen Sie sich den Aufrufer einer Funktion in Python
Passen Sie die Verteilung jeder Gruppe in Python an
Zeigen Sie das Ergebnis der Geometrieverarbeitung in Python an
Kopieren Sie die Liste in Python
Finden Sie die Anzahl der Tage in einem Monat