2012-10-21 3 views
2

"ipython"또는 "code.interact(local=locals())"을 사용하는 경우 전체 프로그램 주소 공간을 피클 파일에 저장하는 방법과 이와 유사한 방법으로 파일을로드하고 그런 다음 해당 컨텍스트에서 실행을 시작하십시오.파이썬 셸 : 피클 전체 상태

가상 메모리 때문에 단순한 스크립트의 경우 완전히 가능해야합니다.

로컬에서 전역 및 전역 함수까지 정의 된 모든 이름 (그리고 이들이 가리키는 비 고아가 된 개체)은 피클됩니다. unpickling 할 때, 그 이름은 원래의 범위에서 다시 지정됩니다.

프로그램이 네트워크를 사용하지 않으므로 상태 불연속이 발생하지 않는다고 가정합니다.

시스템 클럭의 인식 된 불연속성과 관련하여 프로그램이 내결함성이 있으므로 아무런 문제가 없다고 가정합니다.

유일한 설명은 파일 설명자와 관련이있는 것 같습니다. 이상적으로 이것이 존재하지 않는다면, 열려있는 모드 비트와 파일 커서의 위치 및 파일 내용의 체크섬을 얻는 간단한 "파일 설명자 피클"함수가 있어야합니다 (파일 내용의 체크섬). unpickle 할 때 체크섬이 일치하지 않음).

이 "pickling the entire session"을 수행 할 몇 줄이 있습니까?

답변

2

이렇게하려면 dill을 사용하면 파이썬에서 거의 모든 것을 직렬화 할 수 있습니다.

>>> 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 
[email protected]>$ 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 있습니다.

+0

참조 : http://nbviewer.ipython.org/5241793 및 http://mail.scipy.org/pipermail/ipython-dev/2013-August/012207.html –