Почему Python выводит результат в консоли после завершения программы? [Дубликат]

Если вы используете его, библиотека Underscore.js имеет метод clone .

var newObject = _.clone(oldObject);

8
задан Startec 26 February 2015 в 10:55
поделиться

2 ответа

print по умолчанию печатает на sys.stdout и буферизует вывод, который будет распечатан, внутри.

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

Изменено в версии 3.3: добавлен аргумент ключевого слова flush.

Задание документации sys.stdout ,

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

Итак, в вашем случае вам нужно явно очистить, например

import time
for i in range(10):
    print(i, flush=True)
    time.sleep(.5)

Хорошо, есть много путаницы вокруг этой буферизации. Позвольте мне объяснить как можно больше.

Прежде всего, если вы пытаетесь использовать эту программу в терминале, они выполняют буферизацию строк (что в основном означает, что всякий раз, когда вы сталкиваетесь с символом новой строки, отправляете буферизованные данные в stdout), по умолчанию. Итак, вы можете воспроизвести эту проблему в Python 2.7, например

>>> import time
>>> for i in range(10):
...     print i,
...     time.sleep(.5)
... 

И в Python 3.x,

>>> for i in range(10):
...     print(i, end='')
...     time.sleep(.5)

Пропускаем end='', потому что по умолчанию end \n в соответствии с документацией print ,

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)

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

Другой способ воспроизвести эту проблему - сохранить фактическую программу, заданную OP в файле, и выполнить с помощью интерпретатора Python 3.x, вы увидите, что stdout внутренне буферизирует данные и ждет, пока программа закончит печать.

14
ответ дан thefourtheye 21 August 2018 в 10:49
поделиться
  • 1
    @vks Нет, это не так. Я могу воспроизвести проблему. Не используйте интерактивную оболочку, которая буферизируется по строке, попробуйте записать код в файл и выполнить его с помощью интерпретатора. – thefourtheye 26 February 2015 в 08:00
  • 2
    – thefourtheye 26 February 2015 в 08:03
  • 3
    @vks Это точно так. Код в цикле выполняется 10 раз, а все данные, записанные в stdout, буферизуются. Таким образом, ничего не печатается в течение 5 секунд (10 * 0,5 секунд), и, наконец, когда программа выходит, stdout очищается. – thefourtheye 26 February 2015 в 08:05
  • 4
0
ответ дан User007 21 August 2018 в 10:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: