Возникла исключительная ситуация при вставке значений в базу данных Azure COSMOS для API MongoDB: документ не содержит ключ шарда

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

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

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

blockquote>

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

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

blockquote>

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

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 внутренне буферизирует данные и ждет, пока программа закончит печать.

0
задан CrazyCoder 4 March 2019 в 05:22
поделиться