Jupyter笔记本打开时运行所有单元格

17

我有一个Jupyter笔记本,我正在尝试以一种方式设置它,使得打开笔记本时所有单元格都自动运行。

这个行为与包含小部件的笔记本保存输出的行为不同。对我来说,只有当包含小部件的单元格被运行时,小部件才似乎被渲染。考虑以下示例:

from IPython.display import display
from IPython.html.widgets import IntSlider

w = IntSlider()
display(w)

只有在单元格被执行后,滑块才会显示。

这是否可以通过笔记元数据或配置文件来实现?

编辑: https://try.jupyter.org/似乎正在做类似的事情:请注意,当您打开页面时笔记本是不运行的,并且在打开它们时显示输出。

编辑2:添加示例。


我不确定我是否理解了这个论点:据我所知,Python代码是在托管笔记本的服务器上运行的。除了JavaScript(可以嵌入您访问的任何站点)之外,它如何在客户端执行某些操作? - Markus Schanta
那么,如果有人在自动运行的笔记本中放置了 os.system("rm -rf *"),这样做就可以了吗?对我来说不行,我使用 Linux 桌面。如果它在服务器上,并且不是作为 root 运行,它仍然会删除服务器上某些人可能需要的文件或导致维护问题。我想,如果您使用一次性 VM,那么这样做可能没问题,事实上,伯克利大学基于 Jupyter 的 Spark 课程就是这样运行的(一次性 VM,而不是自动运行脚本)。 - Paul
1
注意:有一种“受信任的”IPython笔记本,可以通过命令行中的ipython trust filename.ipynb或网站文件菜单中的信任命令来标记。 - Paul
2
我不认为这与某人手动输入 os.system("rm -rf *") 并运行有什么不同。无论是托管在服务器上的笔记本还是自动执行的服务器上托管的笔记本都可以在服务器上执行任意代码 - Markus Schanta
我同意@MarkusSchanta的观点,这不是一个无效的理由来回答这个SO问题: 要么用户无法输入命令(或笔记本尚未标记为“受信任的”), 要么她被允许运行任意命令,而且她既可以交互式地造成“伤害”,也可以在自动运行笔记本时在稍后阶段造成“伤害”。 - ankostis
4个回答

26
  1. 将以下代码片段粘贴到普通(代码)单元格中,
  2. 执行它(按 [Ctrl + Enter]),并且
  3. 保存笔记本。

下次重新加载时,所有单元格都将运行,并将其刷新的输出保存为检查点。

%%html
<script>
    // AUTORUN ALL CELLS ON NOTEBOOK-LOAD!
    require(
        ['base/js/namespace', 'jquery'], 
        function(jupyter, $) {
            $(jupyter.events).on("kernel_ready.Kernel", function () {
                console.log("Auto-running all cells-below...");
                jupyter.actions.call('jupyter-notebook:run-all-cells-below');
                jupyter.actions.call('jupyter-notebook:save-notebook');
            });
        }
    );
</script>

请注意,如果您清除上述单元格的输出,则必须重复步骤2和3。

提示

您可能考虑使用以下更适合您正在尝试实现的解决方案:

  • Jupyer Thebe:在静态页面中嵌入代码片段,与ipython-kernel后端通信。
  • nteractnteract:从笔记本构建基于Electron的应用程序。
  • Dashboards:旨在允许预配置笔记本单元格输出网格(“仪表板”),将其打包并作为独立的Web应用程序提供的“官方”努力。
你可以在这篇文章中找到该情况的概要。

争议

类似的问题曾经其他网站被问到过,但在这个Google群组帖子中,有人提交了一个解决方案,但是群组管理员将其删除了(!),显然是为了保护地球上的生命 :-) 所以,请小心使用它!


6

这些扩展仅适用于经典笔记本,不支持JupyterLab。但是,你可以查看 https://jupyterlab-contrib.github.io/migrate_from_classical.html。 - András Aszódi

3
我不相信这是可能的。
ipython 不执行未经允许和信任的代码,否则你将遇到包含恶意代码的笔记本加载问题。
您可以在此处检查 ipython 安全模型的详细信息:https://ipython.org/ipython-doc/dev/notebook/security.html。具体来说,需要注意笔记本打开时的代码执行部分:"我们需要解决的安全问题是,不能仅因为用户打开了他们没有编写的笔记本电脑,就立即执行任何代码"。
虽然您可以对笔记本进行明确的信任设置,但我不确定这是否也会允许自动代码执行。我还没有看到过这样的情况,但也许我只是没有找够。我在其他地方看到,自动代码执行不是核心 ipython 软件包提供的功能。请参考此处的问题:https://github.com/ivanov/ipython-trainingwheels/issues/35 除了信任之外,我怀疑这不可能是因为:1)自动代码执行会替换当前保存在笔记本中的所有现有输出,这可能不理想;2)一些笔记本可能包含计算成本高昂的复杂代码,您不希望每次打开笔记本时都运行这些代码。

1
https://try.jupyter.org/ 似乎正在做类似的事情:请注意,当您打开页面并打开笔记本时,它们不会运行,只有在打开时才会显示输出。 - Markus Schanta
1
当我在该网站上打开Julia笔记本时,图形会在笔记本中出现,但顶部的状态显示“内核正在启动,请稍候”,这让我觉得这些图形只是保存的输出,而单元格并没有在加载时实际运行。也许我漏掉了什么,但您要实现的目标与仅保存带有输出的笔记本有何不同呢? - Simon
1
我的一些单元格包含小部件,这些小部件只有在运行单元格后才会显示。以下是一个简单的示例:from IPython.display import display from IPython.html.widgets import IntSlider w = IntSlider() display(w) - Markus Schanta
1
你可以引用这个网址 https://ipython.org/ipython-doc/dev/notebook/security.html 中的部分来改进你的答案,比如这部分:“我们需要解决的安全问题是,不应该因为用户打开了一个他们没有编写的笔记本而执行任何代码。与任何其他程序一样,一旦用户决定在笔记本中执行代码,它就被视为可信任的,并且应该被允许执行任何操作。” - Paul
1
据我所知,Python 代码在托管笔记本的服务器上运行。我认为,在服务器上执行任意代码不会对客户端构成安全问题。从安全角度来看,对于服务器端来说,无论代码是在打开时还是手动执行都没有影响。 - Markus Schanta
1
你的回答是关于为什么这可能不理想,而不是不可能。 - ankostis

2
Scenes Jupyterlab extension对我非常有用。简而言之,“场景”是一组单元格的集合。其中一个场景可以被声明为“init”场景。当笔记本打开时,它的单元格将自动运行,这正是我所需要的。
此外,用户可以在场景之间切换,激活/停用一堆笔记本单元格。
这个概念来自Mathematica。更多细节请参考上面的链接。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接