Utilizzo del metodo sys.stdout.flush ()


Risposte:


173

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


@Ciastopiekarz Cosa possiamo fare per scaricare il buffer su Windows?
helplessKirk,

@Ciastopiekarz Come immagini? Se prendo lo script Python di Andrew Clark e sostituisco la riga di stampa con sys.stdout.write("%d" % i), devo decommentare la chiamata sys.stdout.flush()per ottenere il buffer da visualizzare mentre lo script è in esecuzione.
Bacon Bits

119

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 4stampato allo schermo.

Ciò è dovuto al fatto che l'output è in fase di buffer e, a meno che non si scarichi sys.stdoutdopo ciascuno print, non si vedrà immediatamente l'output. Rimuovi il commento dalla sys.stdout.flush()riga per vedere la differenza.


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

5
Sono solo confuso, quando rimuovo la virgola funziona bene come previsto. C'è qualche logica di buffer per le nuove linee ??
Sunil Lulla,

7

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

Manca una virgola dopo il print iper ottenere il tuo output
SwimBikeRun

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

1

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.