如何腌制或存储 Jupyter (IPython) 笔记本会话以供以后使用

Posted

技术标签:

【中文标题】如何腌制或存储 Jupyter (IPython) 笔记本会话以供以后使用【英文标题】:How to pickle or store Jupyter (IPython) notebook session for later 【发布时间】:2016-03-24 08:49:58 【问题描述】:

假设我正在 Jupyter/Ipython 笔记本中进行更大的数据分析,并完成了大量耗时的计算。然后,由于某种原因,我不得不关闭 jupyter 本地服务器 I,但我想稍后再返回进行分析,而不必再次进行所有耗时的计算。


喜欢喜欢做的是pickle 或存储整个 Jupyter 会话(所有 pandas 数据帧、np.arrays、变量……),这样我就可以安全地关闭服务器知道我可以以与以前完全相同的状态返回到我的会话。

这在技术上是否可行?是否有我忽略的内置功能?


编辑: 基于this 的答案有一个%store magic 应该是“轻量级泡菜”。但是,您必须像这样手动存储变量:

#inside a ipython/nb sessionfoo = "A dummy string"%store foo关闭视野,重启内核%store -r foo#r刷新print(foo) # "A dummy string"

这与我想要的非常接近,但是必须手动完成并且无法区分不同的会话,这使得它不太有用。

【问题讨论】:

这方面有什么进展吗?我只注意到 Spyder IDE 中有一个工作区可以将变量保存到 *.mat 中。但不确定这是否可以移植到 Jupyter Notebook 中。 你考虑过pypi.python.org/pypi/dill 吗? “dill 还提供以下功能:- 保存和加载 python 解释器会话”虽然这是 python,但不确定 ipython 或内核还涉及什么 【参考方案1】:

我认为 Dill 很好地回答了你的问题。

pip install dill

保存笔记本会话:

import dill
dill.dump_session('notebook_env.db')

恢复笔记本会话:

import dill
dill.load_session('notebook_env.db')

Source

【讨论】:

在有生成器时失败(当我想到它时这是有道理的),但似乎这是我们所希望的最接近的! 对我来说效果很好。需要记住的几件事:首先,如果您有 pyodbc 连接对象,您需要关闭它们,然后将它们全部设置为 None 否则,您会收到“TypeError: can't pickle pyodbc.Connection objects”错误.其次,笔记本状态不包括由您的代码生成的图表,因此您需要重新运行单元格以恢复这些图表。 但是我用另一台机器上保存的文件不行 已安装莳萝。我是否从命令行导入 dill dill.dump_session('notebook_env.db')? 不,您需要在运行 Jupyter 笔记本时执行此操作。 dump_session 和 load_session 都应该通过笔记本。您的 load_session 可以在笔记本的开头。并且 dump_session 可以在笔记本的最后。【参考方案2】:

(我宁愿发表评论也不愿将其作为实际答案提供,但我需要更多声誉才能发表评论。)

您可以系统地存储大多数类似数据的变量。我通常做的是将所有数据帧、数组等存储在pandas.HDFStore 中。在笔记本的开头,声明

backup = pd.HDFStore('backup.h5')

然后在生成新变量时存储它们

backup['var1'] = var1

最后,可能是个好主意

backup.close()

在关闭服务器之前。下次您想继续使用笔记本时:

backup = pd.HDFStore('backup.h5')
var1 = backup['var1']

说实话,我也更喜欢 ipython notebook 中的内置功能。您无法以这种方式保存所有内容(例如对象、连接),而且很难使用如此多的样板代码来保持笔记本的井井有条。

【讨论】:

这是一个非常有趣的解决方法,但我可以从字面上感受到与维护这样的系统相关的痛苦。感谢您的提示 :) 这是一个很好的解决方法。简单地说,这个解决方案可能需要安装tables 模块才能创建备份文件。【参考方案3】:

此问题与:How to cache in IPython Notebook?

要保存单个单元格的结果,caching magic 会派上用场。

%%cache longcalc.pkl var1 var2 var3
var1 = longcalculation()
....

重新运行笔记本时,此单元格的内容会从缓存中加载。

这并不能完全回答您的问题,但当所有冗长计算的结果快速恢复时可能就足够了。结合点击笔记本顶部的全部运行按钮对我来说是一个可行的解决方案。

缓存魔法无法保存整个笔记本的状态yet。据我所知,还没有其他系统可以恢复“笔记本”。这将需要保存 python 内核的所有历史记录。加载笔记本并连接到内核后,应加载此信息。

【讨论】:

以上是关于如何腌制或存储 Jupyter (IPython) 笔记本会话以供以后使用的主要内容,如果未能解决你的问题,请参考以下文章

使用 ipdb 在一个单元格中调试 python 代码(jupyter 或 Ipython)

如何将 python3 内核添加到 jupyter (IPython)

如何重置Jupyter / IPython输入提示编号?

如何重置 Jupyter/IPython 输入提示编号?

如何从 Jupyter 4.x 获取 IPython 配置文件行为?

初学者需要IPython 与 Jupyter Notebook 吗?