Как очистить вывод печати Python?
Я предлагаю пять способов сделать это:
- В Python 3 вызывается
print(..., flush=True)
(аргумент flush недоступен в функции печати Python 2, и аналога для оператора print нет).
- Вызовите
file.flush()
выходной файл (для этого мы можем обернуть функцию печати Python 2), например,sys.stdout
- примените это к каждому вызову функции печати в модуле с частичной функцией,
print = partial(print, flush=True)
примененной к модулю global.
- применить это к процессу с помощью flag (
-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__
импорт должен быть в / очень "в верхней части вашего модуля "):
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
функцию (или разыменовать функцию совместимости, если она используется в 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 () и File Objects (для строки в sys.stdin) есть внутренняя буферизация, на которую не влияет эта опция. Чтобы обойти это, вы захотите использовать file.readline () внутри цикла while 1 :.
Изменение значения по умолчанию для операционной среды оболочки
Вы можете получить это поведение для всех процессов Python в среде или средах, которые наследуются от среды, если для переменной среды задать непустую строку:
например, в Linux или OSX:
$ export PYTHONUNBUFFERED=TRUE
или Windows:
C:\SET PYTHONUNBUFFERED=TRUE
из документов :
PYTHONUNBUFFERED
Если для этого параметра задана непустая строка, это эквивалентно указанию опции -u.
добавление
Вот справка по функции печати из 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.
__future__
версия не включает,flush
потому что «аргумент flush был добавлен в Python 3.3 (после того, как print () был перенесен в 2.7 через будущий импорт)» bugs.python.org/issue28458Также, как предлагается в этом блоге, можно открыть
sys.stdout
в небуферизованном режиме:Каждая
stdout.write
иprint
операция будет автоматически покраснел потом.источник
UnsupportedOperation: IOStream has no fileno.
В Python 3.x
print()
функция была расширена:Итак, вы можете просто сделать:
Python Docs Entry
источник
Использование
-u
ключа командной строки работает, но это немного неуклюже. Это означало бы, что программа могла бы вести себя некорректно, если бы пользователь вызывал скрипт без-u
опции. Я обычно использую обычайstdout
, как это:... Теперь все ваши
print
звонки (которые используютsys.stdout
неявно) будут автоматическиflush
редактироваться.источник
def __getattr__(self,name): return object.__getattribute__(self.f, name)
Почему бы не попробовать использовать небуферизованный файл?
ИЛИ
источник
Идея Дэна не совсем работает:
Результат:
Я считаю, что проблема в том, что он наследуется от класса файла, что на самом деле не нужно. В соответствии с документами для sys.stdout:
так меняется
в
заставляет это работать просто отлично.
источник
Вот моя версия, которая также предоставляет writelines () и fileno ():
источник
file
, я получаю сообщение об ошибке. Там нетfile
класса.В Python 3 вы можете перезаписать функцию печати со значением по умолчанию
flush = True
источник
Я сделал это так в Python 3.4:
источник
Сначала я пытался понять, как работает опция сброса. Я хотел сделать «отображение загрузки», и вот решение, которое я нашел:
Первая строка сбрасывает предыдущую печать, а вторая строка печатает новое обновленное сообщение. Я не знаю, существует ли здесь однострочный синтаксис.
источник