如何同时捕获和显示ipython(jupyter笔记本)单元输出?

如何同时捕获和显示ipython(jupyter笔记本)单元输出?,python,jupyter-notebook,ipython,jupyter,Python,Jupyter Notebook,Ipython,Jupyter,如何在同时显示结果的同时在jupyter笔记本中捕获单元格输出?我不想等到一切都完成后再运行变量.show() 我从内置的%%capture中改编了以下自定义单元格魔术: 从io导入StringIO 导入系统 从IPython.core导入magic_参数 从IPython.core.magic导入Magics、cell_magic、Magics_类 从IPython.utils.capture导入CapturedIO 等级三通(StringIO): def uuu init uuuu(self

如何在同时显示结果的同时在jupyter笔记本中捕获单元格输出?我不想等到一切都完成后再运行变量.show()


我从内置的
%%capture中改编了以下自定义单元格魔术:

从io导入StringIO
导入系统
从IPython.core导入magic_参数
从IPython.core.magic导入Magics、cell_magic、Magics_类
从IPython.utils.capture导入CapturedIO
等级三通(StringIO):
def uuu init uuuu(self,初始值='',换行符='\n',流=无):
self.stream=流
super().\uuuu init\uuuu(初始值,换行符)
def写入(自身、数据):
如果self.stream不是None:
self.stream.write(数据)
super().写入(数据)
类捕获和打印输出(对象):
stdout=True
stderr=True
显示=真
定义初始化(self,stdout=True,stderr=True,display=True):
self.stdout=stdout
self.stderr=stderr
self.display=显示
self.shell=None
定义输入(自我):
从IPython.core.getipython导入获取
从IPython.core.displaypub导入CapturingDisplayPublisher
从IPython.core.displayhook导入CapturingDisplayHook
self.sys\u stdout=sys.stdout
self.sys\u stderr=sys.stderr
如果自行显示:
self.shell=get_ipython()
如果self.shell为“无”:
self.save\u display\u pub=None
self.display=False
stdout=stderr=outputs=None
如果self.stdout:
stdout=sys.stdout=Tee(stream=sys.stdout)
如果self.stderr:
stderr=sys.stderr=Tee(stream=sys.stderr)
如果自行显示:
self.save\u display\u pub=self.shell.display\u pub
self.shell.display_pub=CapturingDisplayPublisher()
输出=self.shell.display\u pub.outputs
self.save\u display\u hook=sys.displayhook
sys.displayhook=CapturingDisplayHook(shell=self.shell,
输出=输出)
返回CapturedIO(标准输出、标准输出、输出)
定义退出(自身、exc类型、exc值、回溯):
sys.stdout=self.sys\u stdout
sys.stderr=self.sys\u stderr
如果self.display和self.shell:
self.shell.display\u pub=self.save\u display\u pub
sys.displayhook=self.save\u display\u hook
@魔术班
类自定义Magics(Magics):
@magic_arguments.magic_arguments()
@magic_arguments.argument('output',type=str,default='',nargs='?'))
@magic_arguments.argument('--no stderr',action='store_true')
@magic_arguments.argument('--no stdout',action='store_true')
@magic_arguments.argument('--no display',action='store_true')
@细胞魔术
def三通(自身、线路、单元):
args=magic_arguments.parse_argstring(self.tee,line)
out=非参数。否\u stdout
err=非args.no\u stderr
disp=非参数。无显示
将捕获和打印输出(输出、错误、显示)作为io:
self.shell.run_单元(单元)
如果args.output:
self.shell.user\n[args.output]=io
您需要注册此单元格魔术,通常可以在启动配置文件中注册,也可以将其定义为稍后加载的扩展,例如:

从IPython导入获取
get_ipython().注册\u magics(自定义magics)
现在您可以按如下方式使用它:

>>%%%tee输出
印刷品(42)
42
>>>output.show()
42

需要注意的一点是:它将像原始的
%%capture那样捕获丰富的输出,但不会在原始单元格中打印它们。如果这很重要,您可能会找到一些方法来调整上述内容以包含丰富的输出,可能是通过子类化
CapturingDisplayPublisher/Hook

是的,我还需要将结果保存在一个变量中,并将结果视为其打印结果