Verwendung der Methode sys.stdout.flush ()

Was machtsys.stdout.flush() tun?

 nitin04. Apr. 2012, 23:25

Antworten auf die Frage(5)

Lösung für das Problem

Der Standardausgang von Python wird gepuffert (was bedeutet, dass er einige der Daten sammelt, die für den Standardausgang "geschrieben" wurden, bevor sie in das Terminal geschrieben werden). Berufungsys.stdout.flush() zwingt es, den Puffer zu "leeren", was bedeutet, dass es alles im Puffer in das Terminal schreibt, auch wenn es normalerweise warten würde, bevor es dies tut.

Hier sind einige gute Informationen zu (nicht) gepufferten E / A und warum es nützlich ist:
http://en.wikipedia.org/wiki/Data_buffer
Gepuffertes vs. ungepuffertes IO

 helplessKirk10. Nov. 2015, 17:41
@Ciastopiekarz Was können wir tun, um den Puffer unter Windows zu leeren?
 Ciasto piekarz16. Aug. 2014, 15:53
Dies funktioniert jedoch nicht unter Windows !!!
 Bacon Bits25. Apr. 2016, 06:35
@Ciastopiekarz Wie findest du das? Wenn ich Andrew Clarks Python-Skript nehme und die Druckzeile durch ersetzesys.stdout.write("%d" % i), dann muss ich den anruf auskommentierensys.stdout.flush() um den Puffer anzuzeigen, während das Skript ausgeführt wird.

Nach meinem Verständnis gibt sys.stdout.flush () alle Daten, die bis zu diesem Punkt gepuffert wurden, an ein Dateiobjekt aus. Während der Verwendung von stdout werden Daten im Pufferspeicher gespeichert (für einige Zeit oder bis der Speicher voll 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 leer ist.

<code>import sys
for x in range(10000):
    print "HAPPY >> %s <<\r" % str(x),
    sys.stdout.flush()
</code>

Nach meinem Verständnis wird die Ausgabe von Druckanweisungen immer in den Puffer geschrieben. Und wir werden die Ausgabe auf dem Bildschirm sehen, wenn der Puffer geleert wird. Standardmäßig wird der Puffer beim Beenden des Programms geleert. ABER WIR KÖNNEN DEN PUFFER 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

<code>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()
</code>

chiru @ online: ~ $

*****AUSGABE*****

chiru @ online: ~ $ python flush.py

<code>0 1 2 3 4 5 Flushing buffer
6 7 8 9 0 1 2 3 4 5 Flushing buffer
6 7 8 9
</code>

chiru @ online: ~ $

 SwimBikeRun28. Feb. 2019, 03:19
Nach dem fehlt ein Kommaprint i um Ihre Ausgabe zu erhalten

Betrachten Sie das folgende einfache Python-Skript:

<code>import time
import sys

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

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 der Standard-Systempufferung), wird möglicherweise erst dann eine Ausgabe angezeigt, wenn das Skript abgeschlossen ist. Anschließend wird alles auf einmal angezeigt0 1 2 3 4 auf den Bildschirm gedruckt.

Dies liegt daran, dass die Ausgabe gepuffert wird, es sei denn, Sie spülensys.stdout nach jedemprint Sie werden die Ausgabe nicht sofort sehen. Entfernen Sie den Kommentar aus demsys.stdout.flush() Linie, um den Unterschied zu sehen.

 Sunil Lulla19. Juni 2018, 15:41
Ich bin nur verwirrt, wenn ich das Komma entferne, funktioniert es wie erwartet. Gibt es eine Pufferlogik für neue Zeilen?
 ofer.sheffer02. Aug. 2014, 19:53
In Python 3.x sollte 'print i' durch print (i, end = '') ersetzt werden, da print () in Python 3 ein Standardpräfix end = '\ n' hat, das die Konsole zum Leeren auffordert.

Ihre Antwort auf die Frage