Что делает sys.stdout.flush()
?
Использование метода sys.stdout.flush()
Ответ 1
Стандартный стандарт Python буферизируется (это означает, что он собирает некоторые данные, "записанные" на стандартную версию, прежде чем записывать их на терминал). Вызов sys.stdout.flush()
заставляет его "смывать" буфер, что означает, что он будет записывать все в буфер на терминал, даже если он обычно будет ждать до этого.
Вот некоторая хорошая информация о (un) буферизованном вводе-выводе и почему это полезно:
http://en.wikipedia.org/wiki/Data_buffer
Буферизованный и небуферизованный IO
Ответ 2
Рассмотрим следующий простой скрипт на Python:
import time
import sys
for i in range(5):
print(i),
#sys.stdout.flush()
time.sleep(1)
Это предназначено для печати одного числа каждую секунду в течение пяти секунд, но если вы запустите его как есть (в зависимости от используемой по умолчанию буферизации системы), вы можете не увидеть никаких выходных данных до завершения сценария, а затем все сразу увидите 0 1 2 3 4
выводится на экран.
Это связано с тем, что вывод буферизуется, и если вы не sys.stdout
после каждого print
вы не увидите результат сразу. Удалите комментарий из sys.stdout.flush()
чтобы увидеть разницу.
Ответ 3
В соответствии с моим пониманием, когда мы выполняем инструкции печати, вывод будет записан в буфер. И мы увидим вывод на экране, когда буфер очистится (очищается). По умолчанию буфер будет сброшен, когда программа выйдет. НО МЫ МОЖЕМ ТАКЖЕ ПОЛУЧИТЬ БУФЕР В СООТВЕТСТВИИ С помощью инструкции sys.stdout.flush() в программе. В приведенном ниже буфере кода будет сброшен, когда значение я достигнет 5.
Вы можете понять, выполнив приведенный ниже код.
chiru @онлайн: ~ $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 @онлайн: ~ $
***** ***** ВЫХОДНОЙ
chiru @онлайн: ~ $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 @онлайн: ~ $
Ответ 4
Насколько я понимаю, sys.stdout.flush() выталкивает все данные, которые были буферизованы до этой точки, в файловый объект. При использовании stdout данные сохраняются в буферной памяти (в течение некоторого времени или до тех пор, пока память не будет заполнена), прежде чем они будут записаны в терминал. Использование flush() заставляет очистить буфер и записать в терминал даже до того, как в буфере будет свободное место.
Ответ 5
import sys
for x in range(10000):
print "HAPPY >> %s <<\r" % str(x),
sys.stdout.flush()