2010-05-11 12 views
5

Lo que quería es imprimir 5 puntos que un punto impreso por segundo con time.sleep(), pero el resultado fue de 5 puntos impreso de una vez después de 5 segundos de retraso.
Intenté imprimir y sys.stdout.write, mismo resultado.Problemas con sys.stdout.write() con time.sleep() en una función

Gracias por cualquier consejo.

import time 
import sys 

def wait_for(n): 
    """Wait for {n} seconds. {n} should be an integer greater than 0.""" 
    if not isinstance(n, int): 
     print 'n in wait_for(n) should be an integer.' 
     return 
    elif n < 1: 
     print 'n in wait_for(n) should be greater than 0.' 
     return 
    for i in range(0, n): 
     sys.stdout.write('.') 
     time.sleep(1) 
    sys.stdout.write('\n') 

def main(): 
    wait_for(5) # FIXME: doesn't work as expected 

if __name__ == '__main__': 
    try: 
     main() 
    except KeyboardInterrupt: 
     print '\nAborted.' 

Respuesta

8

Necesita enjuagar después de la escritura.

sys.stdout.write('foo') 
sys.stdout.flush() 
wastetime() 
sys.stdout.write('bar') 
sys.stdout.flush() 
+0

¡Guau, gracias por la respuesta rápida! :-) – philipjkim

4

Debe usar sys.stderr.write para las barras de progreso; stderr tiene la ventaja (no del todo fortuita) de no ser almacenado en memoria intermedia, por lo que no se necesitan llamadas sys.stderr.flush.

Véase también this answer.

+0

¡Gracias por la información! – philipjkim