Как я могу очистить выходные данные функции печати?
Как мне заставить функцию print Python сбросить буферизованные выходные данные на экран?
Отключить буферизацию выводаСмотрите также: если целью является изменение поведения буферизации в целом. Этот вопрос касается явной очистки выходных данных после определенного print вызова, даже если выходные данные все еще буферизуются.
Для доводчиков дубликатов: если новичок задает вопрос о попытке заставить вывод отображаться немедленно, не используя новую строку в конце, пожалуйста, вместо этого используйтеПочему вывод на печать не отображается немедленно в терминале, когда в конце нет новой строки? чтобы закрыть вопрос. Текущий вопрос недостаточно хорош, потому что спрашивающий, скорее всего, не имеет понятия о буферизации или сбросе; другой вопрос предназначен для объяснения этих концепций в первую очередь, тогда как этот вопрос касается технических деталей.
Переведено автоматически
Ответ 1
В Python 3 print может принимать необязательный flush аргумент:
Запускаю python -h, я вижу опцию командной строки:
-u : небуферизованный двоичный стандартный вывод и stderr; также PYTHONUNBUFFERED = x смотрите справочную страницу для получения подробной информации о внутренней буферизации, относящейся к '-u'
Начиная с Python 3.3, вы можете принудительно очистить обычную print() функцию без необходимости использования sys.stdout.flush(); просто установите для аргумента ключевого слова "flush" значение true . Из документации:
Печатайте объекты в файл 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 defprint(*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 isnotNoneelse sys.stdout.flush()
Приведенный выше код совместимости будет охватывать большинство применений, но для более тщательной обработки, смотрите six модуль.
В качестве альтернативы, вы можете просто вызвать file.flush() после печати, например, с помощью инструкции print в Python 2:
И мы действительно можем переопределить новое значение по умолчанию:
>>> print('foo', flush=False) foo
Обратите внимание еще раз, это изменяет только текущую глобальную область, потому что имя print в текущей глобальной области затмит встроенную print функцию (или не будет ссылаться на функцию совместимости, если она используется в Python 2, в этой текущей глобальной области).
Если вы хотите сделать это внутри функции, а не в глобальной области видимости модуля, вам следует присвоить ей другое имя, например:
deffoo(): printf = functools.partial(print, flush=True) printf('print stuff like this')
Если вы объявляете его глобальным в функции, вы изменяете его в глобальном пространстве имен модуля, поэтому вам следует просто поместить его в глобальное пространство имен, если только это конкретное поведение не является именно тем, что вы хотите.
Изменение значения по умолчанию для процесса
Я думаю, что лучший вариант здесь - использовать флаг -u для получения небуферизованных выходных данных.
Принудительно отключите буферизацию stdin, stdout и stderr. В системах, где это важно, также переведите stdin, stdout и stderr в двоичный режим.
Обратите внимание, что в file.readlines() и файловых объектах (для строки в sys.stdin) есть внутренняя буферизация, на которую этот параметр не влияет. Чтобы обойти это, вам нужно будет использовать file.readline() внутри цикла while 1:.
Изменение значения по умолчанию для операционной среды shell
Вы можете получить такое поведение для всех процессов python в среде или средах, которые наследуются от среды, если вы установите переменной среды значение непустой строки:
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.