Использование метода sys.stdout.flush ()

Ответы:

173

Стандартный выход Python буферизуется (это означает, что он собирает некоторые данные, «записанные» в стандартный формат, прежде чем записывает их в терминал). Вызов sys.stdout.flush()заставляет его «очищать» буфер, что означает, что он будет записывать все в буфере в терминал, даже если обычно он будет ждать, прежде чем сделать это.

Вот некоторая хорошая информация о (не) буферизованном вводе / выводе и почему это полезно:
http://en.wikipedia.org/wiki/Data_buffer
Буферизированный против небуферизованного ввода / вывода

Халдейский коричневый
источник
@Ciastopiekarz Что мы можем сделать, чтобы очистить буфер в Windows?
helplessKirk
@Ciastopiekarz Как вы думаете? Если я возьму сценарий Эндрю Кларка Python и заменим строку печати на sys.stdout.write("%d" % i), то мне придется раскомментировать вызов, sys.stdout.flush()чтобы получить буфер для отображения во время выполнения сценария.
Беконные биты
119

Рассмотрим следующий простой скрипт на 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()строки, чтобы увидеть разницу.

Эндрю Кларк
источник
48
В 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 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
источник
Пропустив запятую после, print iчтобы получить вывод
SwimBikeRun
1
import sys
for x in range(10000):
    print "HAPPY >> %s <<\r" % str(x),
    sys.stdout.flush()
JieJ
источник
1

Насколько я понимаю, sys.stdout.flush () выталкивает все данные, которые были буферизованы до этой точки, в файловый объект. При использовании stdout данные сохраняются в буферной памяти (в течение некоторого времени или до тех пор, пока память не будет заполнена), прежде чем они будут записаны в терминал. Использование flush () заставляет очистить буфер и записывать в терминал даже до того, как в буфере будет свободное место.

Сагар Дюнгель
источник