如何使 Jupyter Lab 保存笔记本(以编程方式)

How to cause Jupyter Lab to save notebook (programmatically)

我有一个笔记本 运行 一整夜,打印了一堆东西,包括图像等等。我想以编程方式保存此输出(可能以特定时间间隔)。我还想保存 运行 的代码。在 Jupyter notebook 中,你可以这样做:

from IPython.display import display, Javascript
display(Javascript('IPython.notebook.save_checkpoint();'))
# causes the current .ipynb file to save itself (same as hitting CTRL+s)

(来自 Save an IPython notebook programmatically from within itself?

尽管如此,我发现这个 javascript 注入在 Jupyter 实验室中不起作用(未找到 Jupyter)。我的问题是如何在 Jupyter 实验室中执行与上述代码等效的操作。在检查 jupyter 实验室的 HTML 后,我找不到 Jupyter 对象。

JupyterLab 有一个内置的自动保存功能。您可以使用“高级设置编辑器”的“文档管理器”部分配置时间间隔(请参见下面的屏幕截图)。

但是,如果您真的想要一个JavaScript解决方案,您可以调用键盘快捷键Ctrl + s 与:

from IPython.display import display, Javascript

display(Javascript(
    "document.body.dispatchEvent("
    "new KeyboardEvent('keydown', {key:'s', keyCode: 83, ctrlKey: true}"
    "))"
))

只有当您不将焦点转移到其他笔记本时,这才会有效。但是,您始终可以使用不可见的 HTML 节点(例如 input)首先收回焦点:

from IPython.display import display, HTML

script = """
this.nextElementSibling.focus();
this.dispatchEvent(new KeyboardEvent('keydown', {key:'s', keyCode: 83, ctrlKey: true}));
"""
display(HTML((
    '<img src onerror="{}" style="display:none">'
    '<input style="width:0;height:0;border:0">'
).format(script)))

并且您始终可以将脚本包装在 window.setTimoutwindow.setInterval 中 - 但由于 JupyterLab 内置的自动保存功能,因此不需要它。

您可以使用 ipylab 从 Python 访问 JupyterLab API。要保存笔记本,只需调用 docmanager:save 命令:

from ipylab import JupyterFrontEnd

app = JupyterFrontEnd()
app.commands.execute('docmanager:save')

您可以使用 app.commands.list_commands() 获取完整的命令列表。

我只是想分享 krassowski 对 MacOS 上的 JupyterLab 工作的其他解决方案的一个非常小的调整:

from IPython.display import display, HTML

script = """
this.nextElementSibling.focus();
this.dispatchEvent(new KeyboardEvent('keydown', {key:'s', keyCode: 83, metaKey: true}));
"""
display(HTML((
    '<img src onerror="{}" style="display:none">'
    '<input style="width:0;height:0;border:0">'
).format(script)))