Проблема с print при использовании time.sleep

import time
i = 1

def anp(s):
    lens = len(s)
    g = 0
    for i in range(lens):
        print(s[g], end="")
        time.sleep(0.1)
        g += 1

anp('Привет')

Если запускаю в Python Shell, то программа работает корректно (выводит надпись по буквам с задержкой в 0.1 сек.). Но если запустить её же в онлайн-компиляторе или в любом другом (консоль, PyCharm и т.д.), то выводит сплошной текст без задержек между буквами. В чём ошибка, почему оно по разному работает в разных программах? Ссылка на онлайн-компилятор: https://repl.it/languages/python3


Ответы (4 шт):

Автор решения: MZaytsev

Сейчас пробывал в sublime text, все работает правильно, в онлайн компиляторе сначало получается результат, а потом выводится, в pycharm и idle когда увеличил задержку на 0.5 все нормально. Возможно это из-за того что эти интерпритаторы работают быстрее обычной консоли и результат приходит моментально. Просто поставьте задержку побольше и все будет хорошо.

UPD: Сейчас погуглил разные онлайн компиляторы, и все они работают одинаково, сначало ждут результата потом выводят.

→ Ссылка
Автор решения: insolor

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

Если нужно чтобы каждый символ сразу выводился, можно использовать параметр flush функции print:

print(s[g], end="", flush=True)

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

import sys

...

    for i in range(lens):
        print(s[g], end="")
        sys.stdout.flush()
        time.sleep(0.1)
        g += 1
→ Ссылка
Автор решения: collectPopugaev

Попробуйте в IPython и добавте параметр flush, чтобы сбрасывать буфер вывода в консоль, увидите, что работает. Буферизация вывода происходит на системном уровне, и если есть задержки вывода, то это не ошибка Python или вашей программы.

In [9]: import time
   ...: i = 1
   ...:
   ...: def anp(s):
   ...:     lens = len(s)
   ...:     g = 0
   ...:     for i in range(lens):
   ...:         print(s[g], end="", flush=True)
   ...:         time.sleep(0.1)
   ...:         g += 1
   ...:

In [10]: anp('123456789')
123456789
→ Ссылка
Автор решения: Пушистик
import time


def anp(s):
    for i in range(len(s)):
        print(s[i], end="", flush=True)
        time.sleep(0.1)


anp('Привет')

Просто добавьте в строку кода с print "flush=True", это очистит буфер. И, да, тут вполне можно обойтись без переменных lens и g.

→ Ссылка