Как промыть выход функции печати?
Как заставить функцию печати Python выводить на экран?
Это не дубликат отключить буферизацию вывода - связанный вопрос-это попытка вывода без буферизации, в то время как это является более общим. Лучшие ответы в этом вопросе слишком сильны или задействованы для этого (они не являются хорошими ответами для этого), и этот вопрос можно найти в Google относительным новичком.
14 ответов:
под управлением
python -h
Я вижу опции командной строки:- u: unbuffered binary stdout и stderr; также PYTHONUNBUFFERED=x см. man-страницу для получения подробной информации о внутренней буферизации, относящейся к '-u'
здесь соответствующие док.
начиная с Python 3.3, вы можете заставить нормальный
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 () просто напишет конец.
аргумент file должен быть объектом с методом write(string); если он отсутствует или отсутствует, sys.стандартный вывод будет использоваться. буферизуется ли вывод обычно определяется файлом, но если аргумент ключевого слова flush имеет значение true, поток принудительно сбрасывается.
Как очистить вывод печати Python?
я предлагаю Пять способов сделать это:
- в Python 3, позвоните
print(..., flush=True)
(аргумент flush недоступен в функции печати Python 2, и нет аналога для оператора print).- вызов
file.flush()
в выходном файле (мы можем обернуть функцию печати python 2 для этого), например,sys.stdout
- применить это к каждому вызову функции печати в модуле с частичной функцией,
print = partial(print, flush=True)
применяется к модулю global.- применить это к процессу с флагом (
-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
в режиме без буферизации:sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
каждого
stdout.write
и
С помощью
-u
переключатель командной строки работает, но это немного неуклюже. Это будет означать, что программа потенциально будет вести себя неправильно, если пользователь вызвал скрипт без . Я обычно использую пользовательский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)
... Теперь все ваши
sys.stdout
неявно), будет автоматическиflush
ed.
С Python 3.х они расширили
print()
функция:print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
Итак, вы можете просто сделать:
print("Visiting toilet", flush=True)
почему бы не попробовать использовать небуферизованный файл?
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 сделайте:
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)