Risposte:
Lo standard out di Python è bufferizzato (nel senso che raccoglie alcuni dei dati "scritti" sullo standard out prima di scriverli sul terminale). La chiamata lo sys.stdout.flush()
costringe a "svuotare" il buffer, il che significa che scriverà tutto nel buffer sul terminale, anche se normalmente aspetterebbe prima di farlo.
Ecco alcune buone informazioni sull'I / O (non) bufferizzato e sul perché è utile:
http://en.wikipedia.org/wiki/Data_buffer
IO bufferizzato e non bufferizzato
sys.stdout.write("%d" % i)
, devo decommentare la chiamata sys.stdout.flush()
per ottenere il buffer da visualizzare mentre lo script è in esecuzione.
Considera il seguente semplice script Python:
import time
import sys
for i in range(5):
print(i),
#sys.stdout.flush()
time.sleep(1)
Questo è progettato per stampare un numero ogni secondo per cinque secondi, ma se lo esegui così com'è ora (a seconda del buffering di sistema predefinito) potresti non vedere alcun output fino al completamento dello script, e poi tutti in una volta vedrai 0 1 2 3 4
stampato allo schermo.
Ciò è dovuto al fatto che l'output è in fase di buffer e, a meno che non si scarichi sys.stdout
dopo ciascuno print
, non si vedrà immediatamente l'output. Rimuovi il commento dalla sys.stdout.flush()
riga per vedere la differenza.
Secondo la mia comprensione, quando eseguiremo l'output delle istruzioni di stampa verrà scritto nel buffer. E vedremo l'output sullo schermo quando il buffer viene scaricato (azzerato). Per impostazione predefinita, il buffer verrà scaricato all'uscita dal programma. MA POSSIAMO ANCHE FLUSHARE IL BUFFER MANUALMENTE usando l'istruzione "sys.stdout.flush ()" nel programma. Nel seguente codice il buffer verrà scaricato quando il valore di i raggiunge 5.
Puoi capire eseguendo il codice qui sotto.
chiru@online:~$ 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@online:~$ 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
print i
per ottenere il tuo output
Secondo la mia comprensione sys.stdout.flush () invia tutti i dati che sono stati bufferizzati a quel punto a un oggetto file. Durante l'utilizzo di stdout, i dati vengono archiviati nella memoria buffer (per qualche tempo o fino a quando la memoria non viene riempita) prima che vengano scritti sul terminale. Utilizzando le forze flush () per svuotare il buffer e scrivere sul terminale anche prima che il buffer disponga di spazio vuoto.