Ipython Notebook似乎没有实时打印结果,但似乎以某种方式缓冲,然后批量输出打印件。如何在处理打印命令后立即使ipython打印我的结果?
示例代码:
import time
def printer():
for i in range(100):
time.sleep(5)
print i
假设上述代码位于导入的文件中。我怎么能认为当我打电话给打印机功能时,它每5秒打一个数字而不是最后的所有数字?
请注意,我无法编辑函数printer()
,因为我是从某个外部模块获取的。我希望以某种方式更改ipython笔记本的配置,以便它不使用缓冲区。因此,我也不希望使用sys.stdout.flush(),我想根据问题实时进行,我不希望任何缓冲区开始。
我也尝试使用以下命令加载ipython notebook:
ipython notebook --cache-size=0
但这似乎也不起作用。
答案 0 :(得分:14)
one of the answers在Carsten建议的__getattr__
代表团的评论中,diedthreetimes建议的问题只是money and smallmoney (Transact-SQL).:
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
鸭子。
这适用于使用ipython 3.1.0运行的python 2.7笔记本
答案 1 :(得分:7)
自Python 3.3起,print()
有一个additional flush参数可用于强制刷新:
for i in range(10):
print(i, flush=True)
time.sleep(1)
答案 2 :(得分:1)
尝试一下:
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