Ответы:
Стандартный выход Python буферизуется (это означает, что он собирает некоторые данные, «записанные» в стандартный формат, прежде чем записывает их в терминал). Вызов sys.stdout.flush()
заставляет его «очищать» буфер, что означает, что он будет записывать все в буфере в терминал, даже если обычно он будет ждать, прежде чем сделать это.
Вот некоторая хорошая информация о (не) буферизованном вводе / выводе и почему это полезно:
http://en.wikipedia.org/wiki/Data_buffer
Буферизированный против небуферизованного ввода / вывода
sys.stdout.write("%d" % i)
, то мне придется раскомментировать вызов, sys.stdout.flush()
чтобы получить буфер для отображения во время выполнения сценария.
Рассмотрим следующий простой скрипт на 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()
строки, чтобы увидеть разницу.
Насколько я понимаю, когда мы выполняем операторы вывода, вывод будет записан в буфер. И мы увидим вывод на экране, когда буфер будет очищен (очищен). По умолчанию буфер будет очищен при выходе из программы. НО МЫ МОЖЕМ ТАКЖЕ ПРОМЫВАТЬ БУФЕР ВРУЧНУЮ, используя в программе оператор "sys.stdout.flush ()". В приведенном ниже коде буфер будет очищен, когда значение i достигает 5.
Вы можете понять, выполнив код ниже.
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
чтобы получить вывод
Насколько я понимаю, sys.stdout.flush () выталкивает все данные, которые были буферизованы до этой точки, в файловый объект. При использовании stdout данные сохраняются в буферной памяти (в течение некоторого времени или до тех пор, пока память не будет заполнена), прежде чем они будут записаны в терминал. Использование flush () заставляет очистить буфер и записывать в терминал даже до того, как в буфере будет свободное место.