Використання методу sys.stdout.flush ()


Відповіді:


173

Стандарт стандарту Python буферизований (це означає, що він збирає частину даних, "записаних" для стандартних, перш ніж записати їх в термінал). Виклик sys.stdout.flush()змушує його "очистити" буфер, це означає, що він запише все в буфер до терміналу, навіть якщо зазвичай він зачекає, перш ніж це зробити.

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


@Ciastopiekarz Що ми можемо зробити, щоб буфер промивався на Windows?
безпорадний

@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
Я просто заплутався, коли я знімаю кому, вона працює нормально, як очікувалося. Чи є логіка буфера для нових рядків ??
Sunil Lulla

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

Пропустіть кому після того, print iщоб отримати результат
SwimBikeRun

1
import sys
for x in range(10000):
    print "HAPPY >> %s <<\r" % str(x),
    sys.stdout.flush()

1

Згідно з моїм розумінням, sys.stdout.flush () виштовхує всі дані, які були завантажені до цього пункту, до файлового об’єкта. Під час використання stdout дані зберігаються в буферній пам'яті (деякий час або до заповнення пам'яті), перш ніж вони записуються в термінал. Використання flush () змушує спорожнити буфер і записати в термінал ще до того, як у буфера буде порожній простір.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.