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笔记本
从Python 3.3开始,print()有一个额外的flush参数可用于强制刷新:
for i in range(10):
print(i, flush=True)
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)