Jupyter笔记本:如何仅执行具有特定标记的单元格

时间:2018-06-19 05:41:07

标签: javascript python widget jupyter-notebook

我正在创建一个小部件,它只会执行笔记本中的某些单元格 - 根据更改的数据生成新的图形。虽然Jupyter可以执行诸如在笔记本中执行所有单元格,或执行当前单元格下面的所有单元格等操作。

相反,我想为我想要有选择地执行的单元格创建标签。然后,当我按下按钮时,我可以执行此代码并运行单元格。

小部件代码本身并不重要 - 这部分很容易。更难的是弄清楚如何在笔记本中实现python和javascript之间的通信。有人有主意吗。

1 个答案:

答案 0 :(得分:1)

所以我想出来了。我想其他人一直在寻找类似的答案,所以我发布了它。

首先,我必须标记笔记本中的相关单元格。你可以通过“视图”,然后在笔记本中的“单元工具栏”来做到这一点。

其次,创建具有这些功能的代码单元。第一个功能将得到 所有具有特定标签的单元格。第二个单元格将运行所有具有的单元格 那个标签。在我的例子中,标记名是'plotcell',但是这可以改为任何东西。在尝试使用此函数之前,需要运行此单元格,因此我通常将其设置为初始化单元格。

%%javascript
window.findCellIndicesByTag = function findCellIndicesByTag(tagName) {
  return (Jupyter.notebook.get_cells()
    .filter(
      ({metadata: {tags}}) => tags && tags.includes(tagName)
    )
    .map((cell) => Jupyter.notebook.find_cell_index(cell))
  );
};

window.runPlotCells = function runPlotCells() {
    var c = window.findCellIndicesByTag('plotcell');
    Jupyter.notebook.execute_cells(c);
};

最后,要运行此代码,您需要使用以下代码:

from IPython.core.display import Javascript
from IPython.display import display

def runPlotCells():
    display(Javascript("window.runPlotCells()"))

此代码将执行先前创建的Javascript函数runPlotCells。我使用display函数,以便抑制笔记本中的输出,并在浏览器开发人员控制台中显示结果。

然后在按钮的on_click事件后运行此功能。

那应该是它。