以编程方式获取当前 IPython 笔记本单元格输出?

Programmatically get current IPython notebook cell output?

我有一个在 IPython 笔记本(输入单元格 X)中运行的导入函数,它会产生一个输出(在输出单元格 X 中)。函数运行后,我还有一些代码(也在输入单元格 X 中);该代码有什么方法可以检索当前输出(在输出单元格 X 中)?

可能还有其他方法可以实现我想要实现的目标;但我很好奇以上是否可行

IPython的output caching system定义了几个全局变量:

  • [_](单下划线):存储之前的输出,就像Python的默认解释器。
  • [__](两个下划线):下一个上一个。
  • [___](三个下划线):next-next previous.

此外,在创建每个输出 x 之后,会创建一个变量 _<x>,并将输出作为其值。例如:

In [12]: lst = [i for i in range(11)]

In [13]: lst
Out[13]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

In [14]: _13
Out[14]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

此外,如果您有兴趣,_i<x> 包含输入单元格的内容 x:

In [15]: _i12
Out[15]: 'lst = [i for i in range(11)]'

您可以使用 _Out[X] 获取单元格 X 的输出。如:

In [1]: 2 + 35
Out[1]: 37
In [2]: _ + 3
Out[2]: 40 
In [3]: lst = [i for i in range(5)]
        lst
Out[3]: [0, 1, 2, 3, 4]
In [4]: Out[1] #Using the output of Cell 1
Out[4]: 37
In [5]: Out[3][1] #Using the output of Cell 3
Out[5]: 1

这里,如果你想得到前一个单元格的输出,那么你可以使用_。您还可以使用两个 (__) 或三个下划线 (___) 分别引用前一个单元格和下一个单元格的输出。

但是,如果您的笔记本中有很多单元格并且您想要引用某个特定的单元格,那么 Out[X] 会有所帮助。

现有答案不适用于单元格调用生成自己的函数的情况 stdout

我找到了一个不同的解决方案,它捕获了前一个单元格的所有输出,无论它是如何生成的。

# cell 1:
%%capture output
print("blah")
func_that_prints("Bha")
# -----------------
# cell 2:
prev_cell_output = str(output)
# do something with prev_cell_output

请注意,%%capture 行必须位于单元格的第一行才能正常工作。 output 可以重命名为任何其他变量名。显示的第一个单元格将没有输出(因为它将被捕获)。

output 仅在以下单元格中可用。它是一个 utils.io.CapturedIO 对象,因此您可以对其进行字符串化,甚至对其调用 .show(),这将显示其内容。

更多信息,例如仅捕获 stdout,或仅捕获 stderr 使用 reference.