Make ipython notebook print in real time

前端 未结 3 1964
终归单人心
终归单人心 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:33

    Try this:

    from IPython.display import display, clear_output
    
    display("Hello World") # print string
    display(df) # print object such as dataframe
    
    clear_output(wait=True) # use this if need to clear the output before display, good for dynamic updates
    
    0 讨论(0)
  • 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

    0 讨论(0)
  • 2021-01-01 13:57

    Since Python 3.3, print() has an additional flush argument that can be used to force flushing:

    for i in range(10):
        print(i, flush=True)
        time.sleep(1)  
    
    0 讨论(0)
提交回复
热议问题