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

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

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

1080
задан 07.06.2018, 14:50

7 ответов

import sys
sys.stdout.flush()

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

Ссылки

Python 2

объект файла Python 3

1260
ответ дан 04.10.2019, 10:59
  • 1
    Начиная с python 3.3. существует подход alternaive - печать имеет аргумент для сбрасывания теперь. – Eugene Sajine 18.04.2014, 10:18

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

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

ИЛИ

sys.stdout = open('out.log', 'a', 0)
19
ответ дан 04.10.2019, 10:59

Работая python -h, я вижу параметр командной строки :

-u: освободивший буфер двоичный файл stdout и stderr; также PYTHONUNBUFFERED=x видят, что страница справочника для получения дополнительной информации о внутренней буферизации, касающейся '-u'

Вот, соответствующий документ .

330
ответ дан 04.10.2019, 10:59

Идея Dan не вполне работает:

#!/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

я полагаю, что проблема состоит в том, что это наследовалось классу файла, который на самом деле не необходим. Согласно документам для sys.stdout:

stdout и stderr needn’t быть встроенными объектами файла: любой объект приемлем, пока он имеет запись () метод, который берет аргумент строки.

настолько изменяющийся

class flushfile(file):

к [1 110]

class flushfile(object):

заставляет его работать просто великолепно.

13
ответ дан 04.10.2019, 10:59
  • 1
    Никакое голосование, потому что это - @Dan' s решение... (Необходимо скорее прокомментировать Dan' s отправляют вместо того, чтобы копировать его решение), – gecco 16.01.2013, 04:30

Вот моя версия, которая также предоставляет 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()
8
ответ дан 04.10.2019, 10:59
  • 1
    хотя важный для дизайна, i' m не верный " польза composition" действительно хороший ответ на вопрос, потому что UIButton является на самом деле особенным в этом отношении. я, конечно, won' t downvote, потому что Ваше сообщение действительно делает правильные замечания (на самом деле, я upvoted). – justin 10.02.2020, 10:38

Используя -u работы переключателя командной строки, но это немного неуклюже. Это означало бы, что программа потенциально вела бы себя неправильно, если бы пользователь вызвал сценарий без -u опция. Я обычно использую пользовательское stdout, как это:

class flushfile:
  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 редактор

36
ответ дан 04.10.2019, 10:59
  • 1
    Я рекомендую не наследоваться из файла и затем делегировать к stdout путем добавления. def __getattr__(self,name): return object.__getattribute__(self.f, name) – diedthreetimes 24.06.2013, 09:21

Я сделал это в Python 3.4:

'''To write to screen in real-time'''
message = lambda x: print(x, flush=True, end="")
message('I am flushing out now...')
4
ответ дан 04.10.2019, 10:59
  • 1
    I' ve добавил ссылку из списков Какао-Dev в моем ответе на предмете. Если Вы хотите достигнуть меня, you' ре, конечно, добро пожаловать для обмена сообщениями меня конфиденциально, или публично через Твиттер (дескриптор находится в моем ТАК профиль). Я don' t блог - ТАК мой основной водный вентилятор кодирования. Я веду себя сдержанно. – justin 10.02.2020, 10:37

Теги

Похожие вопросы