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

45

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

可能有其他方法来实现我想要的内容;但我很好奇上述方式是否可行。

3个回答

67

IPython的输出缓存系统定义了若干全局变量:

  • [_](一个下划线):保存先前输出结果,类似于Python默认的解释器。
  • [__](两个下划线):保存上一个先前的输出结果。
  • [___](三个下划线):保存上上一个先前的输出结果。

此外,在每次生成输出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)]'

此外,如果这是从“魔法”命令而不是Python函数中调用的参见此问题 - Louis Maddox
2
太棒了!这就像重新发现 goto 一样! - kelloti

13

要获取单元格 X 的输出,可以使用 _Out[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]会很有帮助。


4
如果在Jupyter中使用(是的,我知道问题标题中有IPython),它的工作方式并不完全符合我的预期。例如,Out [3]并不会给出单元格3的输出,而是任何类型的第三个输出。例如,如果您运行单元格1三次,则Out [3]将是第三个值。 - havlock

5
现有答案无法解决当单元格调用生成自己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,请参阅文档

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接