蟒蛇壳:咸菜整个状态(python shell: pickle entire state)

2019-07-01 13:57发布

当使用任一“ ipython ”或“ code.interact(local=locals()) ”,我想有一个方法来对整个程序地址空间保存到一个pickle文件,并且类似的方式来加载这样的文件和然后开始在这方面执行。

这应该是因为虚拟内存的简单的脚本是完全可能的。

所有定义的名称(和非孤立的对象,他们指向),从当地人向上穿过全局和全局函数,将腌制。 取储存时,这些名字将被再次分配,在原来的范围。

假设程序不使用网络,所以国家不连续性,避免出现。

假设程序是容错与问候系统时钟的感知discontitunity,所以也不是问题。

唯一的挑战似乎是做什么用的文件描述符做。 理想情况下,如果不存在,应该有一个简单的“文件描述符泡菜”功能获取模式位是开放的,文件光标现在的位置,以及文件内容的校验和(示数,如果尝试unpickle时校验和不匹配)。

是否有几行,将完成这个“酸洗整个会话”?

Answer 1:

要做到这一点,我会用莳萝 ,可序列化的Python几乎所有的东西。

>>> import dill
>>> 
>>> def foo(a):
...   def bar(x):
...     return a*x
...   return bar
... 
>>> class baz(object):
...   def __call__(self, a,x):
...     return foo(a)(x)
... 
>>> b = baz()
>>> b(3,2)
6
>>> c = baz.__call__
>>> c(b,3,2)
6
>>> g = dill.loads(dill.dumps(globals()))
>>> g
{'dill': <module 'dill' from '/Library/Frameworks/Python.framework/Versions/7.2/lib/python2.7/site-packages/dill-0.2a.dev-py2.7.egg/dill/__init__.pyc'>, 'c': <unbound method baz.__call__>, 'b': <__main__.baz object at 0x4d61970>, 'g': {...}, '__builtins__': <module '__builtin__' (built-in)>, 'baz': <class '__main__.baz'>, '_version': '2', '__package__': None, '__name__': '__main__', 'foo': <function foo at 0x4d39d30>, '__doc__': None}

莳萝注册它的类型分为pickle注册表,所以如果你有一个使用一些黑盒代码pickle ,你不能编辑它,然后只导入莳萝能神奇地度过,即使没有的Monkeypatching第三方代码工作。

你也想酸洗整个解释器会话......萝可以做到这一点。

>>> # continuing from above
>>> dill.dump_session('foobar.pkl')
>>>
>>> ^D
dude@sakurai>$ python
Python 2.7.5 (default, Sep 30 2013, 20:15:49) 
[GCC 4.2.1 (Apple Inc. build 5566)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import dill
>>> dill.load_session('foobar.pkl')
>>> c(b,3,2)
6

莳萝也有一些很好的工具,帮助您了解是什么原因导致你的酸洗当你的代码没有失败。



文章来源: python shell: pickle entire state