2012-04-04 27 views
98

sys.stdout.flush() ne yapar? Eğer may Bu, bir numara beş saniye her saniye yazdırmak için tasarlanmıştırsys.stdout.flush() yönteminin kullanımı

import time 
import sys 

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

, ama şimdi olduğu gibi bunu çalıştırırsanız (varsayılan sistem arabelleğe bağlı olarak):

+4

Bkz: http://stackoverflow.com/questions/230751/how-to-flush-output-of-python-print – nitin

cevap

107

Python'un standart çıkışı arabelleğe alınır (bu, "yazılan" verilerin bir kısmını veri tabanına yazmadan önce standart olarak topladığı anlamına gelir). sys.stdout.flush() numaralı telefonu arayarak, arabelleği "yıkamak" için zorlar, yani normalde bunu yapmadan önce beklese bile, her şeyi arabelleğe yazacaktır.

İşte (me) tamponlu G/Ç hakkında bazı bilgiler: ve kullanışlı yüzden:
http://en.wikipedia.org/wiki/Data_buffer
Buffered vs unbuffered IO

+2

bu, Windows üzerinde çalışmıyor! –

+0

@Ciastopiekarz Tamponun pencerelerde yıkanması için ne yapabiliriz? – helplessKirk

+0

@Ciastopiekarz Nasıl görüyorsunuz? Andrew Clark'ın Python senaryosunu alıp baskı hattını sys.stdout.write ("% d"% i) 'ile değiştirirsem, o zaman" sys.stdout.flush() "çağrısını kaldırmak zorundayım. komut dosyası yürütülürken görüntülenecek arabellek. –

71

Aşağıdaki basit Python komut düşünün Komut dosyası tamamlanana kadar herhangi bir çıktı görmüyor ve sonra bir kerede ekrana yazdırılan 0 1 2 3 4 göreceksiniz.

Bunun nedeni, çıktının arabelleğe alınmasıdır ve her print'dan sonra sys.stdout temizlenmedikçe, çıktıyı hemen göremezsiniz. Farkı görmek için yorumu sys.stdout.flush() satırından kaldırın.

+20

Python 3.x'te, 'print i' print ile değiştirilmelidir (i, end = '') çünkü Python 3'teki print() 'un bir önek ucu var =' \ n ', konsolun çalmasını ister. –

+0

Sadece bu problemi yaşıyordum! Bunu neden çözdüğünü açıklamak için çok teşekkürler! –

3

biz yürütmek hiç baskı ifadeleri çıkış tampon yazılır benim anlayış, başı olarak. Arabellek temizlendiğinde (temizlendiğinde) çıkışı ekranda göreceğiz. Varsayılan olarak, program çıktığında arabellek temizlenir. ANCAK, programdaki "sys.stdout.flush()" ifadesini kullanarak MANUEL YAZILIMI KESİNLİKLE BAŞLAYABİLİR. Aşağıdaki kodda, i değeri 5'e ulaştığında temizlenir.

Aşağıdaki kodu uygulayarak anlayabilirsiniz.

chiru @ çevrimiçi: ~ $ cat

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 @ çevrimiçi flush.py: ~ $

***** ÇIKIŞ *****

chiru @ çevrimiçi: ~ $ 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 @ çevrimiçi: ~ $

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