2012-04-04 25 views

Respuesta

107

salida estándar de Python se almacena temporalmente (es decir, que recoge algunos de los datos de "escrito" a la salida estándar antes de que lo escribe en el terminal). Llamar al sys.stdout.flush() lo fuerza a "vaciar" el búfer, lo que significa que escribirá todo en el búfer del terminal, incluso si normalmente esperaría antes de hacerlo.

Aquí es una buena información acerca de (des) búfer de E/S y por qué es útil:
http://en.wikipedia.org/wiki/Data_buffer
Buffered vs unbuffered IO

+2

¡esto no funciona en Windows! –

+0

@Ciastopiekarz ¿Qué podemos hacer para que el búfer se vacíe en las ventanas? – helplessKirk

+0

@Ciastopiekarz ¿Cómo te das cuenta? Si tomo el guión Python de Andrew Clark y reemplazo la línea de impresión con 'sys.stdout.write ("% d "% i)', entonces tengo que descomentar la llamada a 'sys.stdout.flush()' para obtener el búfer para visualizar mientras se ejecuta el script. –

71

Considere la siguiente secuencia de comandos de Python simple:

import time 
import sys 

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

Esto está diseñado para imprimir un número cada segundo durante cinco segundos, pero si se ejecuta como es ahora (dependiendo de su almacenamiento temporal del sistema por defecto) se puede no verá ninguna salida hasta que se complete la secuencia de comandos, y luego, de una vez, verá 0 1 2 3 4 impreso en la pantalla.

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

+20

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 descargue. –

+0

¡Estaba teniendo este problema! ¡Muchas gracias por aclarar por qué esto lo resuelve! –

3

Según mi entendimiento, cuando haya que ejecutar la impresión de salida de las declaraciones será escrito para amortiguar. Y veremos la salida en la pantalla cuando el búfer se vacíe (borre). Por defecto, el búfer se vaciará cuando el programa salga. PERO TAMBIÉN PODEMOS LIMPIAR EL BUFFER MANUALMENTE mediante el uso de la declaración "sys.stdout.flush()" en el programa. En el búfer de código siguiente se vaciarán cuando el valor de i alcanza 5.

usted pueda comprender ejecutando el código de abajo.

chiru @ línea: ~ $ 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 @ línea: ~ $

***** ***** SALIDA

chiru @ en línea: ~ $ pitón 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 @ línea: ~ $

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