Yanıtlar:
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
sys.stdout.write("%d" % i)
sağlamak sys.stdout.flush()
için çağrıyı açmam gerekir .
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 4
yazdırılmış ekrana getirin.
Bunun nedeni, çıktı arabelleğe alınıyor olması ve sys.stdout
her 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 .
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
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.