Jupyter获得任意笔记本单元格内容

时间:2016-11-10 00:11:12

标签: python ipython jupyter-notebook jupyter

我想从Python访问笔记本中另一个单元格的文本内容,以便我可以将它提供给单元测试脚本,无论它是否已被执行。看起来这应该是可能的,但我无法在IPython内核中找到合适的API。想法?

This question问同样的问题,但除非必须,否则我真的不想使用魔法。理想情况下,工作流程将是"选择小部件选择"然后是"点击小部件"使测试运行。

背景

我和一些学生一起教他们Python,而在过去我做过这件事的时候我已经set up a bunch of unit tests and then provided instructions on how to run the tests via a shell script了。但是,我和一些无法在家中访问计算机的学生一起工作,所以我决定尝试使用Jupyter笔记本环境(通过mybinder.org)让他们做同样的事情。我已经通过一些ipywidgets和一个帮助脚本来完成大部分工作,该脚本在一些任意代码集上运行单元测试。

3 个答案:

答案 0 :(得分:1)

如果您想捕获特定单元格的内容以便从另一个单元格访问它,则似乎有一个解决方法是在执行第一个单元格的内容并将其加载到文件时,将其写入文件中。在后一个单元格中需要的结果文件(即,给出前一个单元格内容的文本)。

单元格的内容可以通过命令

保存到文件中(在执行相应的单元格时)

%%writefile foo.py

,必须放在单元格的开头。这样会导致单元格的内容(在其中执行上一条命令)被保存到文件foo.py中,稍后再读一次即可。

可以更容易地提供单元格的输出

只需将%%capture output放在单元格的第一行中。然后,单元的输出(执行后)将作为字符串保存到变量output中,并且可以像任何标准python字符串变量一样使用。

参考: Programmatically get current Ipython notebook cell output?https://nbviewer.jupyter.org/github/ipython/ipython/blob/1.x/examples/notebooks/Cell%20Magics.ipynb

答案 1 :(得分:0)

对于已运行的单元,https://ipython.readthedocs.io/en/stable/interactive/reference.html#input-caching-system中描述的输入和输出缓存系统可能很有用。 (在https://stackoverflow.com/a/27952661/8508004使用它的示例)。如下所示,它可在Jupyter笔记本中使用。 (可以查看/访问here相应的笔记本。) enter image description here

答案 2 :(得分:0)

我找到了一个解决方案,可以获取任何单元格的输出。它需要运行一些Javascript。

这是您可以放入单元格中并运行它的代码,它将生成一个名为cell_outputs的Python变量,该变量将是单元格输出的数组,其排列顺序与页面上显示的顺序相同。执行此代码的单元格的输出将有一个空字符串。

%%js
{
    let outputs=[...document.querySelectorAll(".cell")].map(
        cell=> {
            let output=cell.querySelector(".output_text")
            if(output) return output.innerText
            output=cell.querySelector(".rendered_html")
            if(output) return output.innerHTML
            return ""
        }
    )
    
    IPython.notebook.kernel.execute("cell_outputs="+JSON.stringify(outputs))    
}

如果需要特定单元格的输出,只需在Python代码中使用其索引(例如:cell_outputs[2])即可访问单元格#3的输出。

我在Google Chrome上的Jupyter笔记本6.0.3(最近通过Anaconda社区版安装)上对此进行了测试。上面的代码应该可以在任何现代浏览器(Chrome,Firefox或Edge)上正常工作。