Stackless python, вероятно, лучший ... если вы не против полностью перейти на другой дистрибутив Python. stackless
может сериализовать все в python, плюс их тасклеты. Если вы хотите остаться в стандартном дистрибутиве Python, то я бы использовал 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}
Укроп регистрирует свои типы в реестре pickle
, поэтому, если у вас есть какой-то код черного ящика, который использует pickle
, и вы не можете его отредактировать, то просто импортирование укропа может волшебным образом заставить его работать без мартовских патчей сторонних код.
Вот 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
также имеет несколько хороших инструментов , которые помогут вам понять, что приводит к сбою процесса консервирования при сбое кода.
Вы также спрашивали, где он используется для сохранения состояния интерпретатора?
IPython может использовать dill
для сохранения сеанса переводчика в файл. https://nbtest.herokuapp.com/github/ipython/ipython/blob/master/examples/parallel/Using%20Dill.ipynb
klepto использует dill
для поддержки кэширования в памяти, на диск или в базу данных, что позволяет избежать повторного вычисления. https://github.com/uqfoundation/klepto/blob/master/tests/test_cache_info.py
mystic использует dill
для сохранения контрольных точек для больших заданий оптимизации, сохраняя состояние оптимизатора в процессе его выполнения. https://github.com/uqfoundation/mystic/blob/master/tests/test_solver_state.py
Есть пара других пакетов, которые используют dill
для сохранения состояния объектов или сеансов.