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.
@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.
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()
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.
Jawaban:
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
sumber
sys.stdout.write("%d" % i)
, maka saya harus membatalkan komentar panggilansys.stdout.flush()
untuk mendapatkan buffer untuk ditampilkan saat skrip mengeksekusi.Pertimbangkan skrip Python sederhana berikut ini:
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 4
cetak ke layar.Ini karena output sedang buffered, dan kecuali Anda menyiram
sys.stdout
setelah masing-masing,print
Anda tidak akan segera melihat outputnya. Hapus komentar darisys.stdout.flush()
baris untuk melihat perbedaannya.sumber
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.
sumber
print i
untuk mendapatkan hasil Andasumber
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.
sumber