Das Ausgabe-Timing ist falsch, wenn die Standardausgabe (Fehlerausgabe) in eine Datei in Python konvertiert wird

Einführung

Ist es nur meine Umgebung?

Wenn in einem Python-Skript die Standardausgabe (Fehlerausgabe) in eine Datei konvertiert oder von einem anderen Python-Skript ausgeführt wird, ist das Ausgabe-Timing falsch. Es wird sofort ausgegeben, wenn der Prozess endet, nicht wenn print oder sys.stdout.write ausgeführt wird.

In eine Datei schreiben

Skript mit seltsamem Ausgabe-Timing

Dies ist das ausgeführte Python-Skript. Geben Sie einfach jede Sekunde eine Nummer.

child1.py


from time import sleep

for i in range(10):
    print(str(i))
    sleep(1)

Wenn dies mit dem folgenden Befehl ausgeführt wird, wird nichts ausgegeben und nach Ablauf von 10 Sekunden wird sofort ein Protokoll ausgegeben.

$  python3 ./child1.py > stdout.log & tail -f stdout.log

Geänderte Version

Weiter ist die geänderte Version. Versuchen Sie, sys.stdout.flush nach dem Drucken auszuführen.

child2.py


from time import sleep
import sys

for i in range(10):
    print(str(i))
    sys.stdout.flush()
    sleep(1)

Wenn Sie den folgenden Befehl ausführen, wird er ebenfalls jede Sekunde ausgegeben.

$  python3 ./child2.py > stdout.log & tail -f stdout.log

Apropos,

$  python3 ./child1.py

Die Ausgabe auf dem Bildschirm ist problemlos möglich.

Aufruf von einem anderen Python-Skript

Als übergeordnetes Skript habe ich das in hier veröffentlichte verwendet.

parent.py


import sys
import subprocess

def get_lines(cmd):
    '''
    :param cmd:str auszuführender Befehl.
    :rtype: generator
    :return:Standardausgabe(Zeile für Zeile).
    '''
    proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

    while True:
        line = proc.stdout.readline()
        if line:
            yield line.decode('utf-8')

        if not line and proc.poll() is not None:
            break

if __name__ == '__main__':
    for line in get_lines(cmd='python3 ./child1.py'): # ./child2.Wenn ich py starte, wird es jede Sekunde ausgegeben
        sys.stdout.write(line)

Selbst bei der Ausgabe auf dem Bildschirm wird child1.py nach 10 Sekunden sofort und child2.py alle 1 Sekunde ausgegeben.

Fazit

Ist es so etwas? → So etwas.

(Zusatz) Wie im Kommentar unten ausgeführt, wurde bestätigt, dass die Option -u, die beim Ausführen des Befehls python3 hinzugefügt wird, jederzeit ausgegeben wird. Ich bin wieder schlauer geworden. \ # Ich werde versuchen, das System "Ich konnte es nicht tun" zu schreiben.

Recommended Posts

Das Ausgabe-Timing ist falsch, wenn die Standardausgabe (Fehlerausgabe) in eine Datei in Python konvertiert wird
Ändern Sie das Standardausgabeziel in eine Datei in Python
Schreiben Sie die Standardausgabe in eine Datei
Stellen Sie fest, ob beim Ausführen eines Python-Skripts eine Standardausgabe weitergeleitet wird
So erstellen Sie eine JSON-Datei in Python
So geben Sie "Ketsumaimo" standardmäßig in Python aus
Fehler beim Versuch, psycopg2 in Python zu installieren
[Python] Dinge, die überprüft werden müssen, wenn in Django ein Unicode-Dekodierungsfehler auftritt
Analysieren Sie eine JSON-Zeichenfolge, die in eine Datei in Python geschrieben wurde
Ein Memorandum zum Ausführen eines Python-Skripts in einer Bat-Datei
Ich möchte eine Datei mit Python zufällig testen
Beachten Sie beim Initialisieren einer Liste in Python
Verwenden Sie communic (), wenn Sie eine Ausgabe in einem Python-Unterprozess empfangen
Geben Sie einen Binärspeicherauszug in Binärdatei und zurück in eine Binärdatei aus
Beim Veröffentlichen eines Pakets in PyPI wird "HTTP-Fehler: 400 Client-Fehler: Datei ist bereits vorhanden" angezeigt.
So importieren Sie Dateien in Python an eine beliebige Stelle
Eine Standardmethode zum Entwickeln und Verteilen von Paketen in Python
[Python] So geben Sie eine Pandas-Tabelle in eine Excel-Datei aus
Slack-Benachrichtigung, wenn ein bestimmtes Wort auf Twitter mit Heroku mit Python gemurmelt wird
Wenn sich eine Zeichenfolge einer bestimmten Reihe im Schlüssel des Wörterbuchs befindet, wird die Zeichenfolge in den Wert des Wörterbuchs konvertiert.
Ausgabe in eine CSV-Datei mit Python
Machen Sie die Standardausgabe in Python nicht blockierend
Erstellen Sie eine Binärdatei in Python
Beim Schreiben eines Programms in Python
Geben Sie die in S3 Bucket enthaltene Schlüsselliste in eine Datei aus
Konvertieren Sie in eine Zeichenfolge, während Sie die Standardausgabe mit dem Python-Unterprozess ausgeben
Ich habe versucht, eine Python-Datei in eine EXE-Datei zu verwandeln (Rekursionsfehler unterstützt)
[Einführung in Python] So geben Sie eine Zeichenfolge in einer Print-Anweisung aus
[Python] Ausführungszeit, wenn eine Funktion in einen Wörterbuchwert eingegeben wird
Lesen Sie die Standardausgabe eines Unterprozesses zeilenweise in Python
Zeitzonenspezifikation beim Konvertieren einer Zeichenfolge in einen Datums- / Uhrzeittyp mit Python
[Python] Wenn Sie alle Variablen in einer anderen Datei verwenden möchten
"Wertfehler: Handler'file_output_handler 'kann nicht konfiguriert werden" beim Starten eines Python-Programms
Konvertieren Sie in PyTorch geschriebenes Python-Skript mit PyInstaller in exe
Was tun, wenn der Werttyp in Python nicht eindeutig ist?
Automatisch in py-Datei konvertieren, wenn die UI-Datei von PySide aktualisiert wird
Schreiben Sie ein Skript in Shell und Python, um Sie in Slack zu benachrichtigen, wenn der Vorgang abgeschlossen ist
Was tun, wenn in python json .dumps eine Dezimalstelle enthalten ist?
Erstellen Sie Verknüpfungen, um Python-Dateien auf dem Terminal mit VScode auszuführen
Vorsichtsmaßnahmen beim Beizen einer Funktion in Python
Konvertieren Sie die psd-Datei in Python in png
[Python] So fügen Sie eine beliebige Anzahl von Standardeingaben in die Liste ein
Wie bekomme ich Stacktrace in Python?
Ich möchte eine in Python in PDF konvertierte Tabelle wieder in CSV konvertieren
Hash in Perl ist ein Wörterbuch in Python
[Python] Was tun, wenn ein Fehler im Zusammenhang mit der SSL-Authentifizierung zurückgegeben wird?
So schreiben Sie eine Zeichenfolge, wenn Python mehrere Zeilen enthält
[GPS] Erstellen Sie eine kml-Datei mit Python
Ich habe ein Programm erstellt, um die Größe einer Datei mit Python zu überprüfen
Fehler aufgrund von UnicodeDecodeError beim Lesen der CSV-Datei mit Python [Für Anfänger]
Verwendung ist und == in Python
So geben Sie eine Zeichenfolge in Python ein und geben sie unverändert oder in die entgegengesetzte Richtung aus.
Was tun, wenn eine Warnmeldung in der Pip-Liste angezeigt wird?
Was tun, wenn der Fehler RuntimeError angezeigt wird: Python wird nicht als Framework installiert, wenn Sie versuchen, matplitlib und pylab in Python 3.3 zu verwenden
Ich habe ein Skript erstellt, um zu überprüfen, ob an der angegebenen Position der JSON-Datei in Python Englisch eingegeben wird.
Verschiedene Möglichkeiten, die letzte Zeile einer CSV-Datei in Python zu lesen
[Python] Was tun, wenn bei send_keys in Headless Chrome ein Fehler auftritt?
So legen Sie Google Text & Tabellen in einem Ordner zusammen in einer TXT-Datei mit Python ab
Verwenden Sie libsixel, um Sixel in Python auszugeben und das Matplotlib-Diagramm an das Terminal auszugeben.