【问题标题】:Programmatically get current IPython notebook cell output?以编程方式获取当前的 IPython 笔记本单元格输出?
【发布时间】:2015-01-14 21:05:51
【问题描述】:

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

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

【问题讨论】:

    标签: python jupyter-notebook ipython


    【解决方案1】:

    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)]'
    

    【讨论】:

    • 此外,如果这是来自“魔术”命令而不是 Python 函数 see this question
    • 太棒了!这就像重新发现goto
    【解决方案2】:

    您可以使用_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] 会很有帮助。

    【讨论】:

    • 如果在 Jupyter 中使用(是的,我知道问题以 Ipython 作为标题),这至少不像我预期的那样有效。例如,Out[3] 不给出单元格 3 的输出,而是给出任何类型的第三个输出。例如,如果您运行单元格 1 三次,Out[3] 将是第三个值。
    【解决方案3】:

    当单元格调用生成自己的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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-16
      • 1970-01-01
      • 2014-09-09
      • 2013-11-22
      • 1970-01-01
      • 2015-03-15
      相关资源
      最近更新 更多