Подтвердить что ты не робот

Сделать печать ноутбука ipython в режиме реального времени

Ipython Notebook, похоже, не печатает результаты в реальном времени, но, по-видимому, буферизуется определенным образом, а затем массово выводит отпечатки. Как заставить ipython печатать мои результаты сразу после обработки команды печати?

Пример кода:

import time


def printer():
    for i in range(100):
        time.sleep(5)
        print i

Предположим, что указанный выше код находится в импортируемом файле. Как я могу это сделать, когда я вызываю функцию принтера, она печатает число каждые 5 секунд, а не все числа в самом конце?

Обратите внимание, что я не могу редактировать функцию printer(), потому что получаю ее из какого-либо внешнего модуля. Я хочу как-то изменить конфигурацию ipython-ноутбука так, чтобы он не использовал буфер. Поэтому я также не хочу использовать sys.stdout.flush(), я хочу сделать это в режиме реального времени в соответствии с вопросом, я не хочу, чтобы какой-либо буфер начинался с.

Я также попробовал загрузить ipython ноутбук с помощью команды:

ipython notebook --cache-size=0

но это также не работает.

4b9b3361

Ответ 1

Это просто один из ответов на вопрос, предложенный Carsten, включающий __getattr__, предложенный diedthreetimes в комментариях:

import sys
oldsysstdout = sys.stdout
class flushfile():
    def __init__(self, f):
        self.f = f
    def __getattr__(self,name): 
        return object.__getattribute__(self.f, name)
    def write(self, x):
        self.f.write(x)
        self.f.flush()
    def flush(self):
        self.f.flush()
sys.stdout = flushfile(sys.stdout)

В исходном ответе метод __getattr__ не реализован. Без этого он терпит неудачу. Другие варианты ответов на этот вопрос также терпят неудачу в записной книжке.

В записной книжке sys.stdout является экземпляром IPython.kernel.zmq.iostream.OutStream и имеет ряд методов и атрибутов, которые не присутствуют в обычном sys.stdout. Делегирование __getattr__ позволяет flushfile маскироваться как утка ...zmq.iostream.OutStream.

Это работает в ноутбуке python 2.7 с ipython 3.1.0

Ответ 2

Так как Python 3.3, print() имеет параметр дополнительный флеш, который можно использовать для принудительной очистки:

for i in range(10):
    print(i, flush=True)
    time.sleep(1)