Как очистить вывод функции печати?

Как заставить функцию печати Python выводиться на экран?

Это не дубликат отключить буферизацию вывода - связанный вопрос пытается unbuffered вывод, в то время как это более общее. Лучшие ответы в этом вопросе слишком сильны или задействованы для этого (они не являются хорошими ответами для этого), и этот вопрос может быть найден в Google относительным новичком.

14 ответов


import sys
sys.stdout.flush()

печать по умолчанию печать в sys.stdout.

ссылки:


под управлением 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 неявно), будет автоматически flushed.


С Python 3.х они расширили print() функция:

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)

Итак, вы можете просто сделать:

print("Visiting toilet", flush=True)

Запись Документов Python


почему бы не попробовать использовать unbuffered файл?

f = open('xyz.log', 'a', 0)

или

sys.stdout = open('out.log', 'a', 0)

import sys
print 'This will be output immediately.'
sys.stdout.flush()

идея Дэна не совсем работает:

#!/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...')