Почему заявления 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
, и он не будет буферизирован.