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
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.
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 4
impreso a la pantalla
Esto se debe a que la salida se está almacenando en el búfer y, a menos que vacíe sys.stdout
después de cada print
una, no verá la salida inmediatamente. Elimine el comentario de la sys.stdout.flush()
línea para ver la diferencia.
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
print i
para obtener su salida
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.