Penggunaan metode sys.stdout.flush ()

Jawaban:

173

Standar keluar Python adalah buffer (artinya mengumpulkan beberapa data "ditulis" ke standar keluar sebelum ia menulisnya ke terminal). Memanggil sys.stdout.flush()memaksanya untuk "menyirami" buffer, artinya ia akan menulis semua yang ada di buffer ke terminal, bahkan jika biasanya ia akan menunggu sebelum melakukannya.

Berikut ini beberapa informasi bagus tentang (tidak) buffered I / O dan mengapa ini berguna:
http://en.wikipedia.org/wiki/Data_buffer
Buffered vs IO unbuffered

Brown Haldean
sumber
@Ciastopiekarz Apa yang bisa kita lakukan agar buffer di windows memerah?
helplessKirk
@Ciastopiekarz Bagaimana menurut Anda? Jika saya mengambil skrip Python Andrew Clark, dan mengganti garis cetak dengan sys.stdout.write("%d" % i), maka saya harus membatalkan komentar panggilan sys.stdout.flush()untuk mendapatkan buffer untuk ditampilkan saat skrip mengeksekusi.
Bacon Bits
119

Pertimbangkan skrip Python sederhana berikut ini:

import time
import sys

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

Ini dirancang untuk mencetak satu angka setiap detik selama lima detik, tetapi jika Anda menjalankannya seperti sekarang (tergantung pada buffering sistem default Anda), Anda mungkin tidak melihat output apa pun sampai skrip selesai, dan kemudian secara bersamaan Anda akan melihat hasil 0 1 2 3 4cetak ke layar.

Ini karena output sedang buffered, dan kecuali Anda menyiram sys.stdoutsetelah masing-masing, printAnda tidak akan segera melihat outputnya. Hapus komentar dari sys.stdout.flush()baris untuk melihat perbedaannya.

Andrew Clark
sumber
48
Dalam Python 3.x, 'print i' harus diganti dengan print (i, end = '') karena print () di Python 3 memiliki awalan default end = '\ n' yang meminta konsol untuk memerah.
ofer.sheffer
5
Saya hanya bingung, ketika saya menghapus koma itu berfungsi dengan baik seperti yang diharapkan. Apakah ada logika buffer untuk baris baru ??
Sunil Lulla
7

Sesuai pemahaman saya, Kapan pun kita mengeksekusi print statement, output akan ditulis ke buffer. Dan kita akan melihat output di layar ketika buffer disiram (dihapus). Secara default, buffer akan memerah ketika program keluar. TAPI KITA BISA JUGA MENYUSUN BUFFER SECARA MANUAL dengan menggunakan pernyataan "sys.stdout.flush ()" di program. Pada kode di bawah ini buffer akan memerah ketika nilai i mencapai 5.

Anda dapat memahami dengan mengeksekusi kode di bawah ini.

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
chiru
sumber
Kehilangan koma setelah print iuntuk mendapatkan hasil Anda
SwimBikeRun
1
import sys
for x in range(10000):
    print "HAPPY >> %s <<\r" % str(x),
    sys.stdout.flush()
JieJ
sumber
1

Sesuai pemahaman saya sys.stdout.flush () mendorong semua data yang telah disangga ke titik itu ke objek file. Saat menggunakan stdout, data disimpan dalam memori buffer (untuk beberapa waktu atau hingga memori terisi) sebelum ditulis ke terminal. Menggunakan kekuatan flush () untuk mengosongkan buffer dan menulis ke terminal bahkan sebelum buffer memiliki ruang kosong.

Sagar Dhungel
sumber