2011-09-18 35 views
9

Recientemente cambié el sistema operativo y estoy usando un Python más nuevo (2.7). En mi viejo sistema, solía poder imprimir instantáneamente. Por ejemplo, supongamos que tenía un computacionalmente intensa para el bucle:función de impresión python en tiempo real

for i in range(10): 
    huge calculation 
    print i 

entonces como el código completo de cada iteración, se imprimiría i

Sin embargo, en mi sistema actual, pitón parece caché de la salida estándar de manera que el terminal está en blanco durante varios minutos, después de lo cual imprime:

 
1 
2 
3 

en una sucesión corta. Luego, después de algunos minutos más, imprime:

 
4 
5 
6 

y así sucesivamente. ¿Cómo puedo hacer que Python print tan pronto como llegue a la declaración print?

+0

Sí ... eso no es Python. –

Respuesta

8

intenta llamar a ras de salida estándar después de la impresión

import sys 

... 
sys.stdout.flush() 

o utilizar una opción -u command line cuales:

Fuerza stdin, stdout y stderr a ser totalmente sin búfer.

+0

Gracias! Esto funciona, pero ¿sabes cómo puedo configurar esto automáticamente? – Rishi

+2

@Rishi: Lo más cercano que podrías tener para que sea automático (sin tener que recurrir a la compilación de tu propia versión de python) sería establecer la variable de entorno 'PYTHONUNBUFFERED'. –

+0

El comentario de Jeff fue muy útil para mí. Gracias – Rishi

1

Importe la nueva print-as-function como en Python 3.x:

from __future__ import print_function 

(ponga la declaración en la parte superior de su script/módulo)

Esto le permite reemplazar el nuevo función de impresión con la suya:

def print(s, end='\n', file=sys.stdout): 
    file.write(s + end) 
    file.flush() 

La ventaja es que de esta manera su secuencia de comandos funcionará de la misma manera cuando actualice un día a Python 3.x.

Ps1: No lo probé, pero la función de impresión podría simplemente enrojecerse por defecto.

PS2: también le puede interesar progressbar example.

+0

Lo siento @Rishi, confirmé una reescritura de mi respuesta probablemente justo después de ver la versión anterior. – Remi

6

Desde Python 3.3, puede simplemente pasar flush=True a la función de impresión.