Как я могу очистить выходные данные функции печати?
Как мне заставить функцию 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.