2010-12-16 7 views
11

estaba escribiendo un programa simple en Python 3.1 y me encontré con este:python3 sueño() problema

Si funciono esto en el IDLE funciona como previsto - impresiones "Initializing." y se le añaden dos puntos, uno después de cada segundo, y espera la entrada.

from time import sleep 

def initialize(): 
    print('Initializing.', end='') 
    sleep(1) 
    print(" .", end='') 
    sleep(1) 
    print(" .", end='') 
    input() 

initialize() 

El problema es que cuando hago doble clic en el .py para ejecutar el archivo, se ejecuta en lugar de python.exe pythonw.exe, y suceden cosas extrañas: se une a todos los sleep() veces me hace decir espere 2 segundos y luego imprime toda la cadena Initializing. . . a la vez. ¿Por qué pasó esto? ¿Hay alguna manera de evitar que eso suceda en la terminal? Funciona bien si uso el IDLE en Windows y Linux.

+2

Me imagino que el motivo es el búfer se debe a que no ha dado un '\ n' todavía. En general, el uso de 'end' indicará que está avanzando y escribiendo algo inmediatamente. –

Respuesta

21

Esto es porque la salida está siendo amortiguada.

Debe añadir un sys.stdout.flush() después de cada escritura

+0

¡Gracias, esto lo resolvió! – roddds

+1

Y, después de 4 años, me acabo de dar cuenta de que nunca establecí esto como una respuesta aceptada. – roddds

+5

Usando la función 'print' de Python 3, también puede usar el parámetro' flush', p. 'print (". ", end = '', flush = True)' –

5

Parece que la diferencia es que stdout se vacía automáticamente en IDLE. Para mayor eficiencia, los lenguajes de programación a menudo ahorran un montón de llamadas de impresión antes de escribir en la pantalla, lo cual es un proceso lento.

He aquí otra pregunta que tenga la respuesta que necesita: How to flush output of Python print?