Uso del método sys.stdout.flush ()

Respuestas:

173

La salida estándar de Python se almacena en búfer (lo que significa que recopila algunos de los datos "escritos" en la salida estándar antes de escribirlos en el terminal). La llamada lo sys.stdout.flush()obliga a "vaciar" el búfer, lo que significa que escribirá todo en el búfer en el terminal, incluso si normalmente esperaría antes de hacerlo.

Aquí hay buena información sobre las E / S (no) almacenadas en búfer y por qué es útil:
http://en.wikipedia.org/wiki/Data_buffer almacenado en memoria intermedia frente a IO no almacenado en
búfer

Marrón Haldean
fuente
@Ciastopiekarz ¿Qué podemos hacer para que el búfer se vacíe en Windows?
helplessKirk
@Ciastopiekarz ¿Cómo te imaginas? Si tomo el script Python de Andrew Clark y reemplazo la línea de impresión con sys.stdout.write("%d" % i), entonces tengo que descomentar la llamada para sys.stdout.flush()que el búfer se muestre mientras se ejecuta el script.
Bacon Bits
119

Considere el siguiente script simple de Python:

import time
import sys

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

Está diseñado para imprimir un número cada segundo durante cinco segundos, pero si lo ejecuta como está ahora (según el almacenamiento en búfer predeterminado del sistema), es posible que no vea ningún resultado hasta que se complete el script, y de repente verá 0 1 2 3 4impreso a la pantalla

Esto se debe a que la salida se está almacenando en el búfer y, a menos que vacíe sys.stdoutdespués de cada printuna, no verá la salida inmediatamente. Elimine el comentario de la sys.stdout.flush()línea para ver la diferencia.

Andrew Clark
fuente
48
En Python 3.x, 'print i' debe reemplazarse por print (i, end = '') porque print () en Python 3 tiene un prefijo predeterminado end = '\ n' que hace que la consola se vacíe.
ofer.sheffer
55
Estoy confundido, cuando elimino la coma funciona bien como se esperaba. ¿Hay alguna lógica de búfer para nuevas líneas?
Sunil Lulla
7

Según tengo entendido, cuando ejecutemos declaraciones de impresión, la salida se escribirá en el búfer. Y veremos el resultado en la pantalla cuando el búfer se vacíe (se borre). Por defecto, el búfer se vaciará cuando el programa salga. PERO TAMBIÉN PODEMOS ENJUAGAR EL BUFFER MANUALMENTE usando la declaración "sys.stdout.flush ()" en el programa. En el siguiente código, el búfer se vaciará cuando el valor de i alcance 5.

Puedes entenderlo ejecutando el siguiente código.

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
fuente
Falta una coma después del print ipara obtener su salida
SwimBikeRun
1
import sys
for x in range(10000):
    print "HAPPY >> %s <<\r" % str(x),
    sys.stdout.flush()
JieJ
fuente
1

Según mi entendimiento, sys.stdout.flush () transfiere todos los datos que se han almacenado en ese punto a un objeto de archivo. Mientras se usa stdout, los datos se almacenan en la memoria intermedia (durante algún tiempo o hasta que se llena la memoria) antes de que se escriban en el terminal. El uso de flush () obliga a vaciar el búfer y escribir en el terminal incluso antes de que el búfer tenga espacio vacío.

Sagar Dhungel
fuente