Sys.stdout.flush () yönteminin kullanımı


Yanıtlar:


173

Python'un standart çıkışı arabelleğe alınır (yani "yazılan" verilerin bir kısmını terminale yazmadan önce standarda toplamak). Çağırma sys.stdout.flush(), arabelleği "temizlemeye" zorlar, yani normalde bunu yapmadan önce beklese bile, arabellekteki her şeyi terminale yazacaktır.

(Un) arabelleğe alınmış G / Ç ve neden yararlı olduğu hakkında bazı iyi bilgiler:
http://en.wikipedia.org/wiki/Data_buffer
Buffered vs tamponsuz IO


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

@Ciastopiekarz Nasıl anlıyorsunuz? Andrew Clark'ın Python komut dosyasını alıp yazdırma satırını değiştirirsem , komut dosyası yürütülürken arabelleğin görüntülenmesini sys.stdout.write("%d" % i)sağlamak sys.stdout.flush()için çağrıyı açmam gerekir .
Bacon Bits

119

Aşağıdaki basit Python komut dosyasını göz önünde bulundurun:

import time
import sys

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

Bu, beş saniye boyunca saniyede bir sayı yazdırmak üzere tasarlanmıştır, ancak şimdi olduğu gibi çalıştırırsanız (varsayılan sistem arabelleğe alma işleminize bağlı olarak) komut dosyası tamamlanana kadar herhangi bir çıktı göremeyebilirsiniz ve ardından bir kerede 0 1 2 3 4yazdırılmış ekrana getirin.

Bunun nedeni, çıktı arabelleğe alınıyor olması ve sys.stdouther bir işlemden sonra yıkama olmadıkça printçıktıyı hemen göremezsiniz. sys.stdout.flush()Farkı görmek için yorumu satırdan kaldırın .


48
Python 3.x'te 'print i', print (i, end = '') ile değiştirilmelidir, çünkü Python 3'teki print (), konsolun temizlenmesini isteyen varsayılan bir end = '\ n' önekine sahiptir.
ofer.sheffer

5
Sadece kafam karıştı, virgül kaldırdığımda beklendiği gibi çalışıyor. Yeni hatlar için tampon mantığı var mı ??
Sunil Lulla

7

Anladığım kadarıyla, baskı ifadelerini yürüttüğümüzde çıktı arabelleğe yazılır. Tampon temizlendiğinde (temizlendiğinde) çıktıyı ekranda göreceğiz. Varsayılan olarak, programdan çıkıldığında arabellek temizlenir. ANCAK programda "sys.stdout.flush ()" deyimini kullanarak MANUEL OLARAK AYRILABİLİRİZ. Aşağıdaki kodda, i değeri 5'e ulaştığında tampon temizlenir.

Aşağıdaki kodu çalıştırarak anlayabilirsiniz.

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Çıktı almak için sonra virgül eksik
SwimBikeRun

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

1

Anladığım kadarıyla sys.stdout.flush (), o ana kadar arabelleğe alınan tüm verileri bir dosya nesnesine iletir. Stdout kullanırken, veriler terminale yazılmadan önce arabellekte (bir süre veya bellek dolana kadar) saklanır. Flush () yöntemini kullanarak arabelleği boşaltmaya ve arabellek boş alana sahip olmadan önce terminale yazmaya zorlar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.