代码之家  ›  专栏  ›  技术社区  ›  krishnab

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

  •  1
  • krishnab  · 技术社区  · 7 年前

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

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

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   krishnab    7 年前

    所以我想出来了。我想其他人也在寻找类似的答案,所以我把它贴出来。

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

    第二,用这些函数创建一个代码单元。第一个函数将得到 具有特定标签的所有单元格。第二个单元格将运行所有具有 那个标签。在我的例子中,标记名是“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函数以运行plotcells。我用了 display 函数的作用是抑制笔记本中的输出,并在浏览器开发人员控制台中显示结果。

    然后在按钮上的“单击”事件之后运行此函数。

    就这样吧。

    推荐文章