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.
@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.
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()
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.
Respuestas:
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
fuente
sys.stdout.write("%d" % i)
, entonces tengo que descomentar la llamada parasys.stdout.flush()
que el búfer se muestre mientras se ejecuta el script.Considere el siguiente script simple de Python:
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 4
impreso a la pantallaEsto se debe a que la salida se está almacenando en el búfer y, a menos que vacíe
sys.stdout
después de cadaprint
una, no verá la salida inmediatamente. Elimine el comentario de lasys.stdout.flush()
línea para ver la diferencia.fuente
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.
fuente
print i
para obtener su salidafuente
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.
fuente