【问题标题】:python shell: pickle entire statepython shell:腌制整个状态
【发布时间】:2012-10-21 08:15:13
【问题描述】:

当使用“ipython”或“code.interact(local=locals())”时,我希望有一种方法可以将整个程序地址空间保存到一个 pickle 文件中,以及类似的方法来加载这样一个文件然后启动在该上下文中执行。

这对于简单的脚本来说应该是完全可能的,因为有虚拟内存。

所有定义的名称(以及它们指向的非孤立对象),从本地到全局和全局函数,都将被腌制。取消腌制时,这些名称将在其原始范围内再次分配。

假设程序不使用网络,因此避免了那里的状态不连续性。

假设程序对于感知到的系统时钟的不连续性是容错的,所以也没有问题。

唯一的挑战似乎是如何处理文件描述符。理想情况下,如果它不存在,应该有一个简单的“文件描述符pickle”函数来获取它打开的模式位,文件光标的位置,以及文件内容的校验和(如果尝试 unpickle 时校验和不匹配)。

是否有几行代码可以完成“腌制整个会话”?

【问题讨论】:

    标签: python serialization memory-management state pickle


    【解决方案1】:

    为此,我会使用dill,它可以在 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}
    

    Dill 将它的类型注册到 pickle 注册表中,所以如果你有一些使用 pickle 的黑盒代码并且你不能真正编辑它,那么只需导入 dill 就可以神奇地使它工作而无需猴子补丁第 3 方代码。

    您还想腌制整个解释器会话... dill 也可以这样做。

    >>> # 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
    

    Dill 还拥有some good tools,可帮助您了解在代码失败时导致酸洗失败的原因。

    猜你喜欢
    • 2012-01-04
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多