2012-12-26 7 views
5

Sto eseguendo Python versione 2.7.3 su MacOSX.Perché le istruzioni di stampa python che contengono gli argomenti 'end =' si comportano diversamente nei cicli while?

Considerate questo blocco di codice:

from __future__ import print_function 
import time 
x = 0 
while x < 5: 
    print(x) 
    x += 1 
    time.sleep(1) 

Se si esegue questo script, osservo l'uscita mi aspetto: I numeri 0 attraverso 4 con un carattere \n aggiunto a ciascun numero. Inoltre, ogni numero viene visualizzato dopo una pausa di un secondo.

0 
1 
2 
3 
4 

Ora considerano questo blocco di codice:

from __future__ import print_function 
import time 
x = 0 
while x < 5: 
    print(x, end='') 
    x += 1 
    time.sleep(1) 

L'uscita è quello che mi aspetto, senza i 's \n, ma la tempistica è inaspettato. Invece di visualizzare ogni cifra dopo una pausa di un secondo, il processo attende quattro secondi, quindi visualizza tutti e cinque i numeri.

Perché il comportamento print('string') si comporta diversamente da print('string', end='') in loop while? C'è un modo per visualizzare i personaggi senza newline, un secondo alla volta? Ho provato sys.stdout.write(str(x)), ma si comporta allo stesso modo di print(end='').

risposta

16

Poiché il flusso di output è a buffer di linea, poiché non viene cancellato esplicitamente tra le istruzioni di stampa, attende fino a quando non vede una nuova riga per svuotare l'output.

È possibile forzare lo scarico tramite sys.stdout.flush().

In alternativa, se si esegue Python con il flag -u, si disabilita il buffering di linea.

+1

Su python 3.5 'print (x, end = '', flush = True)' funzionerà ugualmente – evan54

7

Questo è solo il buffering di stdout di Python. This answer ha alcune informazioni in più.

Si può lavare in questo modo:

import sys 
from __future__ import print_function 
import time 
x = 0 
while x < 5: 
    print(x, end='') 
    x += 1 
    sys.stdout.flush() 
    time.sleep(1) 

alternativa iniziare pitone python -u e non sarà tamponata.