gpt4 book ai didi

python 壳: pickle entire state

转载 作者:行者123 更新时间:2023-11-28 16:46:57 24 4
gpt4 key购买 nike

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

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

所有已定义的名称(以及它们指向的非孤立对象),从局部变量到全局变量和全局函数,都将被 pickle 。解封时,这些名称将在其原始范围内再次分配。

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

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

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

是否有几行代码可以完成“pickling the entire session”?

最佳答案

为此,我会使用 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 方代码就可以神奇地使其工作。

您还想 pickle 整个解释器 session ……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

莳萝还有 some good tools帮助您了解代码失败时导致 pickle 失败的原因。

关于 python 壳: pickle entire state,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12996118/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com