使用莳萝保存Jupyter Notebook的当前状态

问题描述

我已经看到许多答案,指出要使用莳萝来保存内核的当前状态;

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

# load
dill.load_session('notebook_env.db')

现在,notebook_env.db是什么?它是我的.ipynb文件的路径吗?

解决方法

我是dill的作者。我通常会使用.'pkl扩展名而不是.db ...,但这是一个pickle文件。基本上,笔记本中的所有对象都会被序列化(转换为字符串),然后存储在文件中。

序列化是这样的:

>>> import dill
>>> class Foo(object):
...   def __init__(self,x):
...     self.x = x
...   def bar(self,y):
...     return self.x + y
... 
>>> f = Foo(4)
>>> _f = dill.dumps(f)
>>> _f
b'\x80\x03cdill._dill\n_create_type\nq\x00(cdill._dill\n_load_type\nq\x01X\x04\x00\x00\x00typeq\x02\x85q\x03Rq\x04X\x03\x00\x00\x00Fooq\x05h\x01X\x06\x00\x00\x00objectq\x06\x85q\x07Rq\x08\x85q\t}q\n(X\n\x00\x00\x00__module__q\x0bX\x08\x00\x00\x00__main__q\x0cX\x08\x00\x00\x00__init__q\rcdill._dill\n_create_function\nq\x0e(cdill._dill\n_create_code\nq\x0f(K\x02K\x00K\x02K\x02KCC\n|\x01|\x00_\x00d\x00S\x00q\x10N\x85q\x11X\x01\x00\x00\x00xq\x12\x85q\x13X\x04\x00\x00\x00selfq\x14h\x12\x86q\x15X\x07\x00\x00\x00<stdin>q\x16h\rK\x02C\x02\x00\x01q\x17))tq\x18Rq\x19c__builtin__\n__main__\nh\rNN}q\x1aNtq\x1bRq\x1cX\x03\x00\x00\x00barq\x1dh\x0e(h\x0f(K\x02K\x00K\x02K\x02KCC\n|\x00j\x00|\x01\x17\x00S\x00q\x1eN\x85q\x1fh\x12\x85q h\x14X\x01\x00\x00\x00yq!\x86q"h\x16h\x1dK\x04C\x02\x00\x01q#))tq$Rq%c__builtin__\n__main__\nh\x1dNN}q&Ntq\'Rq(X\x07\x00\x00\x00__doc__q)NX\r\x00\x00\x00__slotnames__q*]q+utq,Rq-)\x81q.}q/h\x12K\x04sb.'
>>> del f         
>>> del Foo
>>> f = dill.loads(_f)
>>> f.bar(3)
7
>>> 

在这里,对于简单的对象,您可以开始了解对象到字符串的唯一编码是如何工作的。例如,很容易找出与以下序列中包含的整数对应的内容,并且对元组进行序列化所得到的字符串与列表所产生的字符串略有不同。

>>> dill.dumps([1,2,3])
b'\x80\x03]q\x00(K\x01K\x02K\x03e.'
>>> dill.dumps([1,3,4,5])
b'\x80\x03]q\x00(K\x01K\x02K\x03K\x04K\x05e.'
>>> dill.dumps((1,5))
b'\x80\x03(K\x01K\x02K\x03K\x04K\x05tq\x00.'
>>>