Стандартный выход Python буферизуется (это означает, что он собирает некоторые данные, «записанные» в стандартный формат, прежде чем записывает их в терминал). Вызов sys.stdout.flush()заставляет его «очищать» буфер, что означает, что он будет записывать все в буфере в терминал, даже если обычно он будет ждать, прежде чем сделать это.
@Ciastopiekarz Что мы можем сделать, чтобы очистить буфер в Windows?
helplessKirk
@Ciastopiekarz Как вы думаете? Если я возьму сценарий Эндрю Кларка Python и заменим строку печати на sys.stdout.write("%d" % i), то мне придется раскомментировать вызов, sys.stdout.flush()чтобы получить буфер для отображения во время выполнения сценария.
Беконные биты
119
Рассмотрим следующий простой скрипт на Python:
import timeimport sysfor i in range(5):print(i),#sys.stdout.flush()
time.sleep(1)
Он предназначен для печати одного числа каждую секунду в течение пяти секунд, но если вы запустите его как есть (в зависимости от используемой по умолчанию системной буферизации), вы можете не увидеть никаких выходных данных до завершения сценария, а затем все сразу увидите 0 1 2 3 4напечатанным на экран.
Это потому, что вывод буферизуется, и если вы не сбросите sys.stdoutпосле каждого, printвы не увидите результат сразу. Удалите комментарий из sys.stdout.flush()строки, чтобы увидеть разницу.
В Python 3.x «print i» следует заменить на print (i, end = ''), потому что print () в Python 3 имеет префикс по умолчанию end = '\ n', который заставляет консоль сбрасываться.
ofer.sheffer
5
Я просто запутался, когда убираю запятую, она работает нормально, как и ожидалось. Есть ли буферная логика для новых строк ??
Сунил Люлла
7
Насколько я понимаю, когда мы выполняем операторы вывода, вывод будет записан в буфер. И мы увидим вывод на экране, когда буфер будет очищен (очищен). По умолчанию буфер будет очищен при выходе из программы. НО МЫ МОЖЕМ ТАКЖЕ ПРОМЫВАТЬ БУФЕР ВРУЧНУЮ, используя в программе оператор "sys.stdout.flush ()". В приведенном ниже коде буфер будет очищен, когда значение i достигает 5.
Вы можете понять, выполнив код ниже.
chiru@online:~$ cat flush.py
import timeimport sysfor i in range(10):print iif 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()
Насколько я понимаю, sys.stdout.flush () выталкивает все данные, которые были буферизованы до этой точки, в файловый объект. При использовании stdout данные сохраняются в буферной памяти (в течение некоторого времени или до тех пор, пока память не будет заполнена), прежде чем они будут записаны в терминал. Использование flush () заставляет очистить буфер и записывать в терминал даже до того, как в буфере будет свободное место.
Ответы:
Стандартный выход Python буферизуется (это означает, что он собирает некоторые данные, «записанные» в стандартный формат, прежде чем записывает их в терминал). Вызов
sys.stdout.flush()
заставляет его «очищать» буфер, что означает, что он будет записывать все в буфере в терминал, даже если обычно он будет ждать, прежде чем сделать это.Вот некоторая хорошая информация о (не) буферизованном вводе / выводе и почему это полезно:
http://en.wikipedia.org/wiki/Data_buffer
Буферизированный против небуферизованного ввода / вывода
источник
sys.stdout.write("%d" % i)
, то мне придется раскомментировать вызов,sys.stdout.flush()
чтобы получить буфер для отображения во время выполнения сценария.Рассмотрим следующий простой скрипт на Python:
Он предназначен для печати одного числа каждую секунду в течение пяти секунд, но если вы запустите его как есть (в зависимости от используемой по умолчанию системной буферизации), вы можете не увидеть никаких выходных данных до завершения сценария, а затем все сразу увидите
0 1 2 3 4
напечатанным на экран.Это потому, что вывод буферизуется, и если вы не сбросите
sys.stdout
после каждого,print
вы не увидите результат сразу. Удалите комментарий изsys.stdout.flush()
строки, чтобы увидеть разницу.источник
Насколько я понимаю, когда мы выполняем операторы вывода, вывод будет записан в буфер. И мы увидим вывод на экране, когда буфер будет очищен (очищен). По умолчанию буфер будет очищен при выходе из программы. НО МЫ МОЖЕМ ТАКЖЕ ПРОМЫВАТЬ БУФЕР ВРУЧНУЮ, используя в программе оператор "sys.stdout.flush ()". В приведенном ниже коде буфер будет очищен, когда значение i достигает 5.
Вы можете понять, выполнив код ниже.
источник
print i
чтобы получить выводисточник
Насколько я понимаю, sys.stdout.flush () выталкивает все данные, которые были буферизованы до этой точки, в файловый объект. При использовании stdout данные сохраняются в буферной памяти (в течение некоторого времени или до тех пор, пока память не будет заполнена), прежде чем они будут записаны в терминал. Использование flush () заставляет очистить буфер и записывать в терминал даже до того, как в буфере будет свободное место.
источник