如何使 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.setTimout
或 window.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)))
我有一个笔记本 运行 一整夜,打印了一堆东西,包括图像等等。我想以编程方式保存此输出(可能以特定时间间隔)。我还想保存 运行 的代码。在 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.setTimout
或 window.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)))