Разве time.sleep () не работает внутри цикла for с функцией print, использующей атрибут end? - PullRequest
0 голосов
/ 05 июля 2019

Итак, я только недавно изучал Python и играл с некоторым кодом.Я хотел напечатать какой-нибудь символ без разрывов строк в цикле с некоторой задержкой.Я использовал функцию time.sleep () внутри цикла for.Но все, что он делает - это задерживает вывод на общее время, которое потребовалось бы в цикле, все сразу, а затем выводит символ.

Я пробовал это без атрибута «end», и этоработал отлично.Но я не хотел прерывания строки.

from time import sleep
print("starting the progress bar")


for i in range(50):
    sleep(0.1)
    print("#", end = '')

Я ожидал, что на выходе будет напечатан символ и с задержкой напечатан другой символ.Но скрипт задерживается на 0,1 секунды 50 раз, а затем выводит все символы одновременно

Ответы [ 5 ]

1 голос
/ 05 июля 2019

Поскольку python имеет линейную буферизацию, он будет ждать новой строки перед печатью стандартного вывода.

Решение 1:

Добавьте PYTHONUNBUFFERED = 1 в ваш env.var:

export PYTHONUNBUFFERED=1

Это позволит немедленно сбросить вывод

Решение 2:

Поскольку вы используете Python 3, вы можете использовать flush = True

for i in range(50):
    sleep(0.1)
    print("#", end = '', flush=True)
0 голосов
/ 05 июля 2019

Вы можете использовать опцию -u при запуске вашей программы.

$ man python3


PYTHON(1)                                                            PYTHON(1)

...

       -u     Force  the  stdout  and  stderr  streams to be unbuffered.  This
              option has no effect on the stdin stream.

Беги так: python3 -u file.py


Кроме того, вы можете установить переменную окружения PYTHONUNBUFFERED в вашей оболочке

       PYTHONUNBUFFERED
              If this is set to a non-empty string it is equivalent to  speci-
              fying the -u option.

Вроде так: PYTHONUNBUFFERED="yes" python3 file.py


Наконец, вы можете использовать flush=True, как уже упоминалось в других ответах.

0 голосов
/ 05 июля 2019

Я только что нашел решение на Reddit.

Reddit прокомментируйте, почему это не работает и как новички попадают в ту же ловушку

Итак, это как-то связано с буферизацией.

Вот код, который будет работать;

from time import sleep
print("starting the progress bar")


for i in range(50):
    sleep(0.1)
    print("#", end = '', flush = True)
0 голосов
/ 05 июля 2019

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

from time import sleep
print("starting the progress bar")


for i in range(50):
    sleep(0.1)
    print("#", end = '', flush=True)

Обратите внимание, что все, что вы используете для просмотра , вывод также может быть буферизован. Это не может быть изменено в вашем скрипте.

0 голосов
/ 05 июля 2019

Вы использовали end в печати, поэтому вы спите, работая должным образом, но из-за конца весь вывод будет отображаться после диапазона (50) и режима сна (0.1)

    from time import sleep
    import sys
    print("starting the progress bar")

    for x in range(50):
        print("#", end = '')
        sleep(0.1)
        sys.stdout.flush()

Используйте это

...