Make ipython notebook print in real time

前端 未结 3 1986
终归单人心
终归单人心 2021-01-01 13:12

Ipython Notebook doesn\'t seem to print results in real time, but seems to buffer in a certain way and then bulk output the prints. How can I make ipython print my results a

3条回答
  •  一向
    一向 (楼主)
    2021-01-01 13:35

    This is merely one of the answers to the question suggested by Carsten incorporating the __getattr__ delegation suggested by diedthreetimes in a comment:

    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)
    

    In the original answer, the __getattr__ method is not implemented. Without that, it fails. Other variants in answers to that question also fail in a notebook.

    In a notebook, sys.stdout is an instance of IPython.kernel.zmq.iostream.OutStream and has a number of methods and attributes not present in the usual sys.stdout. Delegating __getattr__ allows a flushfile to masquerade as a ...zmq.iostream.OutStream duck.

    This works in a python 2.7 notebook run with ipython 3.1.0

提交回复
热议问题