使ipython笔记本实时打印

pat*_*_ai 22 python buffer ipython-notebook

Ipython Notebook似乎没有实时打印结果,但似乎以某种方式缓冲,然后批量输出打印件.如何处理打印命令后,如何让ipython打印我的结果?

示例代码:

import time


def printer():
    for i in range(100):
        time.sleep(5)
        print i
Run Code Online (Sandbox Code Playgroud)

假设上面的代码在导入的文件中.我怎么能说,当我打电话给打印机功能时,它每隔5秒打印一个数字而不是最后的所有数字?

请注意,我无法编辑该功能,printer()因为我是从某个外部模块获取的.我希望以某种方式更改ipython笔记本的配置,以便它不使用缓冲区.因此,我也不希望使用sys.stdout.flush(),我想根据问题实时做,我不希望任何缓冲区开始.

我也尝试使用以下命令加载ipython notebook:

ipython notebook --cache-size=0
Run Code Online (Sandbox Code Playgroud)

但这似乎也不起作用.

dre*_*cko 14

这仅仅是卡斯滕提出的问题的答案之一,其中包含了在三个时间段内在评论中提出的授权:__getattr__

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)
Run Code Online (Sandbox Code Playgroud)

在原始答案中,该__getattr__方法未实现.没有它,它失败了.该问题的答案中的其他变体也在笔记本中失败.

在笔记本中,sys.stdout是一个实例IPython.kernel.zmq.iostream.OutStream并且具有许多通常不存在的方法和属性sys.stdout.委派__getattr__允许flushfile伪装成...zmq.iostream.OutStream鸭子.

这适用于运行ipython 3.1.0的python 2.7笔记本


kma*_*dov 7

从Python 3.3开始,print()有一个额外的flush参数可用于强制刷新:

for i in range(10):
    print(i, flush=True)
    time.sleep(1)  
Run Code Online (Sandbox Code Playgroud)