2012-04-04 13 views

risposta

107

Lo standard di Python è bufferizzato (ovvero raccoglie alcuni dei dati "scritti" sullo standard prima che venga scritto sul terminale). Chiamando sys.stdout.flush(), si impone di "svuotare" il buffer, il che significa che scriverà tutto nel buffer sul terminale, anche se normalmente lo aspetterebbe prima di farlo.

Ecco alcune buone informazioni su (dis) buffer di I/O e perché è utile:
http://en.wikipedia.org/wiki/Data_buffer
Buffered vs unbuffered IO

+2

questo non funziona su Windows però !!! –

+0

@Ciastopiekarz Cosa possiamo fare per avere il buffer svuotato su Windows? – helplessKirk

+0

@Ciastopiekarz Come capisci? Se prendo lo script Python di Andrew Clark e sostituisco la riga di stampa con 'sys.stdout.write ("% d "% i)', allora devo togliere il commento alla chiamata a 'sys.stdout.flush()' per ottenere il buffer da visualizzare mentre lo script è in esecuzione. –

71

Si consideri il seguente semplice script Python:

import time 
import sys 

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

Questo è stato progettato per stampare un numero ogni secondo per cinque secondi, ma se lo si esegue come è ora (a seconda del buffer di sistema predefinito) si può non vedere alcun output fino a quando lo script non viene completato, quindi tutto in una volta vedrai lo 0 1 2 3 4 stampato sullo schermo.

Questo perché l'output è in fase di buffering e, a meno che non si svuota sys.stdout dopo ogni print, non si vedrà immediatamente l'output. Rimuovi il commento dalla riga sys.stdout.flush() per vedere la differenza.

+20

In Python 3.x, 'print i' deve essere sostituito con print (i, end = '') perché print() in Python 3 ha un prefisso predefinito = '\ n' che richiede alla console di svuotare. –

+0

Stavo solo avendo questo problema! Grazie mille per aver chiarito perché questo lo risolve! –

3

Come per la mia comprensione, quando mai eseguiamo stampa dichiarazioni di output verrà scritto nel buffer. E vedremo l'output sullo schermo quando il buffer viene svuotato (cancellato). Di default il buffer verrà svuotato al termine dell'esecuzione del programma. MA POSSIAMO INOLTRE FARE IL BUFFER MANUALMENTE usando la frase "sys.stdout.flush()" nel programma. Nel buffer di codice riportato di seguito verrà svuotato quando il valore di i raggiunge 5.

È possibile comprendere eseguendo il codice riportato di seguito.

Chiru @ on-line: ~ $ 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 @ on-line: ~ $

***** ***** USCITA

Chiru @ on-line: ~ $ python 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 @ on-line: ~ $

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