Почему заявления python print, содержащие аргументы "end =", ведут себя по-разному в while-loop?

Я запускаю python версии 2.7.3 на MacOSX.

Рассмотрим этот блок кода:

from __future__ import print_function
import time
x = 0
while x < 5:
    print(x)
    x += 1
    time.sleep(1)

Если я запустил этот script, я наблюдаю ожидаемый результат: цифры 0 через 4 с символом \n, добавленным к каждому номеру. Более того, каждый номер отображается после паузы в одну секунду.

0
1
2
3
4

Теперь рассмотрим этот блок кода:

from __future__ import print_function
import time
x = 0
while x < 5:
    print(x, end='')
    x += 1
    time.sleep(1)

Результат - это то, что я ожидаю, 01234 без \n, но время неожиданно. Вместо того, чтобы отображать каждую цифру после паузы в одну секунду, процесс ждет четыре секунды, а затем отображает все пять номеров.

Почему print('string') ведет себя по-другому от print('string', end='') в while-loops? Есть ли способ отображать символы без символов новой строки, по одной секунде за раз? Я пробовал sys.stdout.write(str(x)), но он ведет себя так же, как print(end='').

Ответ 1

Поскольку выходной поток буферизируется по строке - поскольку он явно не очищается между операторами печати, он ждет, пока он не увидит новую строку, чтобы очистить вывод.

Вы можете принудительно выполнить промывку через sys.stdout.flush().

Альтернативно, если вы запустите Python с флагом -u, он отключит буферизацию строки.

Ответ 2

Это просто python-буферизация stdout. Этот ответ содержит дополнительную информацию.

Вы можете очистить его так:

import sys
from __future__ import print_function
import time
x = 0
while x < 5:
    print(x, end='')
    x += 1
    sys.stdout.flush()
    time.sleep(1)

Альтернативно запустите python python -u, и он не будет буферизирован.