如何让Jupyter Notebook的print输出同时展示在Shell和单元格
解决Jupyter Notebook print输出同时展示在Shell和单元格的方案
问题原因
你当前的配置直接将sys.stdout重定向到了文件描述符1(对应Shell的标准输出),覆盖了Jupyter自身绑定的stdout捕获对象,因此Jupyter无法捕获打印内容展示在单元格中。
解决方案
替换你~/.ipython/profile_default/startup路径下的启动代码,使用自定义的双输出流实现同时写入两个目标:
import sys class DualStdout: def __init__(self, jupyter_stdout, shell_stdout): self.jupyter_stdout = jupyter_stdout self.shell_stdout = shell_stdout def write(self, data): self.jupyter_stdout.write(data) self.shell_stdout.write(data) self.flush() def flush(self): self.jupyter_stdout.flush() self.shell_stdout.flush() # 保留原Jupyter stdout的同时绑定Shell stdout sys.stdout = DualStdout(sys.stdout, open(1, 'w', buffering=1))
注意事项
- 若需要
stderr内容也同时输出到两处,可按照相同逻辑对sys.stderr做重定向处理 - 代码中
buffering=1设置为行缓冲,可保证输出实时刷新,避免内容堆积在缓冲区不显示 - 配置修改完成后重启Jupyter Notebook即可生效
内容的提问来源于stack exchange,提问作者Andres Echeverri
相关产品推荐
相关产品推荐

