我有一个在IPython笔记本(输入单元格X)中运行的导入函数,它产生一个输出(在输出单元格X中)。函数运行后,我有更多的代码(也在输入单元格X中);有没有办法让代码检索当前输出(在输出单元格X中)?
可能有其他方法可以做我想要达到的目标;但如果上述情况可能,我很好奇。
谢谢!
答案 0 :(得分:28)
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)]'
答案 1 :(得分:7)
您可以使用_
或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]
将会有所帮助。
答案 2 :(得分:1)
当单元格调用生成自己的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
,或者仅使用reference捕获stderr
。