以编程方式获取当前的Ipython笔记本电脑输出?

kyp*_*hos 17 python ipython ipython-notebook

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

可能有其他方法可以做我想要实现的目标; 但如果上述情况可能,我很好奇.

谢谢!

Mat*_*DMo 29

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

  • [ _](单个下划线):存储以前的输出,就像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]
Run Code Online (Sandbox Code Playgroud)

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

In [15]: _i12
Out[15]: 'lst = [i for i in range(11)]'
Run Code Online (Sandbox Code Playgroud)

  • 惊人的!这就像再次发现“goto”! (3认同)

Jay*_*tel 7

您可以使用_或获取单元格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
Run Code Online (Sandbox Code Playgroud)

在这里,如果您想获得前一个单元格的输出,那么您可以使用_.您也可以使用两个(__)或三个下划线(___)来分别引用下一个上一个和下一个上一个单元格的输出.

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

  • 如果在 Jupyter 中使用(是的,我知道这个问题以 Ipython 作为标题),这至少不会像我预期的那样工作。例如,Out[3] 不给出单元格 3 的输出,而是给出任何类型的第三个输出。例如,如果运行单元格 1 三次,Out[3] 将是第三个值。 (4认同)

sta*_*son 6

当细胞调用生成自己的函数时,现有答案不起作用stdout

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

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

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

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

有关更多信息,例如仅捕获stdout,或仅stderr使用参考