Вопрос-Ответ

How can I flush the output of the print function?

Как я могу очистить выходные данные функции печати?

Как мне заставить функцию print Python сбросить буферизованные выходные данные на экран?


Отключить буферизацию вывода Смотрите также: если целью является изменение поведения буферизации в целом. Этот вопрос касается явной очистки выходных данных после определенного print вызова, даже если выходные данные все еще буферизуются.

Для доводчиков дубликатов: если новичок задает вопрос о попытке заставить вывод отображаться немедленно, не используя новую строку в конце, пожалуйста, вместо этого используйте Почему вывод на печать не отображается немедленно в терминале, когда в конце нет новой строки? чтобы закрыть вопрос. Текущий вопрос недостаточно хорош, потому что спрашивающий, скорее всего, не имеет понятия о буферизации или сбросе; другой вопрос предназначен для объяснения этих концепций в первую очередь, тогда как этот вопрос касается технических деталей.

Переведено автоматически
Ответ 1

В Python 3 print может принимать необязательный flush аргумент:

print("Hello, World!", flush=True)

В Python 2 после вызова print выполните:

import sys
sys.stdout.flush()

По умолчанию print печатается в sys.stdout (подробнее о файловых объектах см. Документацию).

Ответ 2

Запускаю python -h, я вижу опцию командной строки:


-u : небуферизованный двоичный стандартный вывод и stderr; также PYTHONUNBUFFERED = x смотрите справочную страницу для получения подробной информации о внутренней буферизации, относящейся к '-u'


Вот соответствующая документация.

Ответ 3

Начиная с Python 3.3, вы можете принудительно очистить обычную print() функцию без необходимости использования sys.stdout.flush(); просто установите для аргумента ключевого слова "flush" значение true . Из документации:


печать (* objects, sep='', end='\n', file= sys.stdout, flush=False)


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


Все аргументы, не являющиеся ключевыми словами, преобразуются в строки, как это делает str(), и записываются в поток, разделенные sep и сопровождаемые end . И sep, и end должны быть строками; они также могут быть None , что означает использование значений по умолчанию. Если объекты не заданы, print() просто напишет end .


Аргументом file должен быть объект с методом write(string); если он отсутствует или None , будет использоваться sys.stdout . Буферизован ли вывод, обычно определяется файлом, но если аргумент ключевого слова flush имеет значение true, поток принудительно очищается.


Ответ 4

Как очистить выходные данные Python print?


Я предлагаю пять способов сделать это:


  • В Python 3 вызовите print(..., flush=True) (аргумент flush недоступен в функции print в Python 2, и нет аналога для инструкции print).

  • Вызов file.flush() выходного файла (для этого мы можем обернуть функцию print в python 2), например, sys.stdout

  • применяйте это к каждому вызову функции print в модуле с частичной функцией,

    print = partial(print, flush=True) применяется к модулю global.

  • примените это к процессу с помощью флага (-u), передаваемого команде интерпретатора

  • примените это к каждому процессу python в вашей среде с помощью PYTHONUNBUFFERED=TRUE (и отключите переменную, чтобы отменить это).

Python 3.3+

Используя Python 3.3 или выше, вы можете просто предоставить flush=True в качестве ключевого слова аргумент для print функции:

print('foo', flush=True) 

Python 2 (или < 3.3)

Они не перенесли flush аргумент в Python 2.7, поэтому, если вы используете Python 2 (или меньше 3.3) и хотите код, совместимый как со 2, так и с 3, могу я предложить следующий код совместимости. (Обратите внимание, что __future__ импорт должен быть в / very "near the top of your module"):

from __future__ import print_function
import sys

if sys.version_info[:2] < (3, 3):
old_print = print
def print(*args, **kwargs):
flush = kwargs.pop('flush', False)
old_print(*args, **kwargs)
if flush:
file = kwargs.get('file', sys.stdout)
# Why might file=None? IDK, but it works for print(i, file=None)
file.flush() if file is not None else sys.stdout.flush()

Приведенный выше код совместимости будет охватывать большинство применений, но для более тщательной обработки, смотрите six модуль.

В качестве альтернативы, вы можете просто вызвать file.flush() после печати, например, с помощью инструкции print в Python 2:

import sys
print 'delayed output'
sys.stdout.flush()

Изменение значения по умолчанию в одном модуле на flush=True

Вы можете изменить значение по умолчанию для функции печати с помощью functools.partial в глобальной области видимости модуля:

import functools
print = functools.partial(print, flush=True)

если вы посмотрите на нашу новую частичную функцию, по крайней мере, в Python 3:

>>> print = functools.partial(print, flush=True)
>>> print
functools.partial(<built-in function print>, flush=True)

Мы видим, что это работает так же, как обычно:

>>> print('foo')
foo

И мы действительно можем переопределить новое значение по умолчанию:

>>> print('foo', flush=False)
foo

Обратите внимание еще раз, это изменяет только текущую глобальную область, потому что имя print в текущей глобальной области затмит встроенную print функцию (или не будет ссылаться на функцию совместимости, если она используется в Python 2, в этой текущей глобальной области).

Если вы хотите сделать это внутри функции, а не в глобальной области видимости модуля, вам следует присвоить ей другое имя, например:

def foo():
printf = functools.partial(print, flush=True)
printf('print stuff like this')

Если вы объявляете его глобальным в функции, вы изменяете его в глобальном пространстве имен модуля, поэтому вам следует просто поместить его в глобальное пространство имен, если только это конкретное поведение не является именно тем, что вы хотите.

Изменение значения по умолчанию для процесса

Я думаю, что лучший вариант здесь - использовать флаг -u для получения небуферизованных выходных данных.

$ python -u script.py

или

$ python -um package.module

Из документов:


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


Обратите внимание, что в file.readlines() и файловых объектах (для строки в sys.stdin) есть внутренняя буферизация, на которую этот параметр не влияет. Чтобы обойти это, вам нужно будет использовать file.readline() внутри цикла while 1:.


Изменение значения по умолчанию для операционной среды shell

Вы можете получить такое поведение для всех процессов python в среде или средах, которые наследуются от среды, если вы установите переменной среды значение непустой строки:

например, в Linux или OSX:

$ export PYTHONUNBUFFERED=TRUE

или Windows:

C:\SET PYTHONUNBUFFERED=TRUE

из документов:


PYTHONUNBUFFERED


Если для параметра задано значение непустой строки, это эквивалентно указанию параметра -u.



Дополнение

Вот справка по функции print из Python 2.7.12 - обратите внимание, что в ней нет flush аргумента:

>>> from __future__ import print_function
>>> help(print)
print(...)
print(value, ..., sep=' ', end='\n', file=sys.stdout)

Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
python