Как очистить вывод функции печати?
Как заставить функцию печати Python выводиться на экран?
Это не дубликат отключить буферизацию вывода - связанный вопрос пытается unbuffered вывод, в то время как это более общее. Лучшие ответы в этом вопросе слишком сильны или задействованы для этого (они не являются хорошими ответами для этого), и этот вопрос может быть найден в Google относительным новичком.
14 ответов
под управлением python -h
Я вижу опции командной строки:
- u: unbuffered binary stdout и stderr; также PYTHONUNBUFFERED=x см. man-страницу для получения подробной информации о внутренней буферизации, относящейся к'- u'
здесь соответствующий doc.
начиная с Python 3.3, вы можете заставить normal print()
функция для того чтобы потопить без потребности использовать sys.stdout.flush()
; просто установить "заподлицо" аргумента "истина". От документация:
print (*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
печать объектов в потоковый файл, разделенных sep и затем end. sep, end и file, если они присутствуют, должны быть заданы в качестве аргументов ключевого слова.
все аргументы без ключевых слов преобразуются в строки, такие как STR () does и записываются в поток, разделяются sep и следуют end. И sep, и end должны быть строками; они также могут быть None, что означает использование значений по умолчанию. Если объекты не заданы, print () просто напишет end.
аргумент file должен быть объектом с методом write(string); если его нет или нет, sys.будет использоваться stdout. буферизация вывода обычно определяется файлом, но если аргумент ключевого слова flush имеет значение true, поток принудительно сбрасывается.
Как очистить вывод печати Python?
я предлагаю Пять способов сделать это:
- в Python 3, вызов
print(..., flush=True)
(аргумент flush недоступен в функции печати Python 2, и нет аналога для оператора print). - вызов
file.flush()
в выходном файле (для этого мы можем обернуть функцию печати python 2), например,sys.stdout
- применить это к каждому вызову функции печати в модуле с частичной функцией,
print = partial(print, flush=True)
применяется к глобальному модулю. - применить это к процессу с флагом (
-u
) передается команде интерпретатора - применить это к каждому процессу python в вашей среде с
PYTHONUNBUFFERED=TRUE
(и снимите переменную, чтобы отменить это).
Python 3.3+
С помощью Python 3.3 или выше, вы можете просто предоставить flush=True
как аргумент ключевого слова для :
>>> 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.
также, как полагают в этот блог можно расконсервировать sys.stdout
в unbuffered режиме:
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
каждого stdout.write
и print
деятельность автоматически будет потоплена потом.
С помощью -u
переключатель командной строки работает, но он немного неуклюж. Это означало бы, что программа потенциально будет вести себя неправильно, если пользователь вызвал скрипт без . Я обычно использую custom stdout
, например:
class flushfile(object):
def __init__(self, f):
self.f = f
def write(self, x):
self.f.write(x)
self.f.flush()
import sys
sys.stdout = flushfile(sys.stdout)
... Теперь все ваши print
вызовов (которые используют sys.stdout
неявно), будет автоматически flush
ed.
С Python 3.х они расширили print()
функция:
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
Итак, вы можете просто сделать:
print("Visiting toilet", flush=True)
почему бы не попробовать использовать unbuffered файл?
f = open('xyz.log', 'a', 0)
или
sys.stdout = open('out.log', 'a', 0)
идея Дэна не совсем работает:
#!/usr/bin/env python
class flushfile(file):
def __init__(self, f):
self.f = f
def write(self, x):
self.f.write(x)
self.f.flush()
import sys
sys.stdout = flushfile(sys.stdout)
print "foo"
результат:
Traceback (most recent call last):
File "./passpersist.py", line 12, in <module>
print "foo"
ValueError: I/O operation on closed file
Я считаю, что проблема в том, что он наследует от класса file, который на самом деле не нужно. Согласно документам для sys.стандартный вывод:
stdout и stderr не должны быть встроены файловые объекты: любой объект является приемлемым пока он имеет метод write() это требует строкового аргумента.
так меняется
class flushfile(file):
до
class flushfile(object):
он работает просто отлично.
вот моя версия, которая предоставляет writelines () и fileno () тоже:
class FlushFile(object):
def __init__(self, fd):
self.fd = fd
def write(self, x):
ret = self.fd.write(x)
self.fd.flush()
return ret
def writelines(self, lines):
ret = self.writelines(lines)
self.fd.flush()
return ret
def flush(self):
return self.fd.flush
def close(self):
return self.fd.close()
def fileno(self):
return self.fd.fileno()
любил решение Дэна! Для python3 do:
import io,sys
class flushfile:
def __init__(self, f):
self.f = f
def write(self, x):
self.f.write(x)
self.f.flush()
sys.stdout = flushfile(sys.stdout)
в Python 3 Вы можете перезаписать функцию печати со значением по умолчанию flush = True
def print(*objects, sep=' ', end='\n', file=sys.stdout, flush=True):
__builtins__.print(*objects, sep=sep, end=end, file=file, flush=flush)
Я сделал это в Python 3.4:
'''To write to screen in real-time'''
message = lambda x: print(x, flush=True, end="")
message('I am flushing out now...')