Verwendung der Methode sys.stdout.flush ()

Antworten:

173

Pythons Standardausgang wird gepuffert (was bedeutet, dass einige der Daten, die zum Standardausgang "geschrieben" wurden, gesammelt werden, bevor sie in das Terminal geschrieben werden). Durch das Aufrufen wird sys.stdout.flush()der Puffer "geleert", was bedeutet, dass alles im Puffer in das Terminal geschrieben wird, auch wenn es normalerweise vorher warten würde.

Hier sind einige gute Informationen zu (un) gepufferten E / A und warum sie nützlich sind:
http://en.wikipedia.org/wiki/Data_buffer Gepufferte vs ungepufferte E /
A.

Haldean Brown
quelle
@Ciastopiekarz Was können wir tun, um den Puffer unter Windows zu leeren?
helplessKirk
@Ciastopiekarz Wie findest du das? Wenn ich Andrew Clarks Python-Skript nehme und die Druckzeile durch ersetze sys.stdout.write("%d" % i), muss ich den Aufruf sys.stdout.flush()auskommentieren, damit der Puffer angezeigt wird, während das Skript ausgeführt wird.
Bacon Bits
119

Betrachten Sie das folgende einfache Python-Skript:

import time
import sys

for i in range(5):
    print(i),
    #sys.stdout.flush()
    time.sleep(1)

Dies ist so konzipiert, dass fünf Sekunden lang jede Sekunde eine Zahl gedruckt wird. Wenn Sie sie jedoch so ausführen, wie sie jetzt ist (abhängig von Ihrer Standardsystempufferung), wird möglicherweise keine Ausgabe angezeigt, bis das Skript abgeschlossen ist, und dann wird auf einmal 0 1 2 3 4gedruckt auf den Bildschirm.

Dies liegt daran, dass die Ausgabe gepuffert wird und Sie die Ausgabe nicht sofort sehen , wenn Sie nicht sys.stdoutnach jedem printleeren. Entfernen Sie den Kommentar aus der sys.stdout.flush()Zeile, um den Unterschied zu sehen.

Andrew Clark
quelle
48
In Python 3.x sollte 'print i' durch print (i, end = '') ersetzt werden, da print () in Python 3 das Standardpräfix end = '\ n' hat, das die Konsole zum Leeren auffordert.
ofer.sheffer
5
Ich bin nur verwirrt, wenn ich das Komma entferne, funktioniert es wie erwartet. Gibt es eine Pufferlogik für neue Zeilen?
Sunil Lulla
7

Nach meinem Verständnis wird die Ausgabe bei jeder Ausführung von Druckanweisungen in den Puffer geschrieben. Und wir werden die Ausgabe auf dem Bildschirm sehen, wenn der Puffer geleert (gelöscht) wird. Standardmäßig wird der Puffer beim Beenden des Programms geleert. ABER WIR KÖNNEN DEN BUFFER AUCH MANUELL SPÜLEN, indem wir die Anweisung "sys.stdout.flush ()" im Programm verwenden. Im folgenden Code wird der Puffer geleert, wenn der Wert von i 5 erreicht.

Sie können dies verstehen, indem Sie den folgenden Code ausführen.

chiru@online:~$ cat flush.py
import time
import sys

for i in range(10):
    print i
    if i == 5:
        print "Flushing buffer"
        sys.stdout.flush()
    time.sleep(1)

for i in range(10):
    print i,
    if i == 5:
        print "Flushing buffer"
        sys.stdout.flush()
chiru@online:~$ python flush.py 
0 1 2 3 4 5 Flushing buffer
6 7 8 9 0 1 2 3 4 5 Flushing buffer
6 7 8 9
Chiru
quelle
Fehlt ein Komma nach dem print i, um Ihre Ausgabe zu erhalten
SwimBikeRun
1
import sys
for x in range(10000):
    print "HAPPY >> %s <<\r" % str(x),
    sys.stdout.flush()
JieJ
quelle
1

Nach meinem Verständnis überträgt sys.stdout.flush () alle Daten, die bis zu diesem Punkt gepuffert wurden, an ein Dateiobjekt. Während der Verwendung von stdout werden Daten im Pufferspeicher gespeichert (für einige Zeit oder bis der Speicher gefüllt ist), bevor sie in das Terminal geschrieben werden. Die Verwendung von flush () erzwingt das Leeren des Puffers und das Schreiben in das Terminal, noch bevor der Puffer leeren Speicherplatz hat.

Sagar Dhungel
quelle