2016-11-22 6 views
0

와 피클 문제 : 내장 함수가 수정 될 수있는 것보다딜/클래스 직렬화 <code>dill</code>를 사용하는 경우 내장 기능

PicklingError: Can't pickle <built-in function raw_input>: it's not the same object as __builtin__.raw_input 


    File "D:\_devs\Python01\Anaconda27\lib\site-packages\dill\dill.py", line 236, in dump 
    pik.dump(obj) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 224, in dump 
    self.save(obj) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 331, in save 
    self.save_reduce(obj=obj, *rv) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 401, in save_reduce 
    save(args) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 554, in save_tuple 
    save(element) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 331, in save 
    self.save_reduce(obj=obj, *rv) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 401, in save_reduce 
    save(args) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 554, in save_tuple 
    save(element) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 331, in save 
    self.save_reduce(obj=obj, *rv) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 401, in save_reduce 
    save(args) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 554, in save_tuple 
    save(element) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 331, in save 
    self.save_reduce(obj=obj, *rv) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 401, in save_reduce 
    save(args) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 554, in save_tuple 
    save(element) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 331, in save 
    self.save_reduce(obj=obj, *rv) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 425, in save_reduce 
    save(state) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 

    File "D:\_devs\Python01\Anaconda27\lib\site-packages\dill\dill.py", line 835, in save_module_dict 
    StockPickler.save_dict(pickler, obj) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 655, in save_dict 
    self._batch_setitems(obj.iteritems()) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 687, in _batch_setitems 
    save(v) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 331, in save 
    self.save_reduce(obj=obj, *rv) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 425, in save_reduce 
    save(state) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 

    File "D:\_devs\Python01\Anaconda27\lib\site-packages\dill\dill.py", line 835, in save_module_dict 
    StockPickler.save_dict(pickler, obj) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 655, in save_dict 
    self._batch_setitems(obj.iteritems()) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 687, in _batch_setitems 
    save(v) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 331, in save 
    self.save_reduce(obj=obj, *rv) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 425, in save_reduce 
    save(state) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 

    File "D:\_devs\Python01\Anaconda27\lib\site-packages\dill\dill.py", line 835, in save_module_dict 
    StockPickler.save_dict(pickler, obj) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 655, in save_dict 
    self._batch_setitems(obj.iteritems()) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 687, in _batch_setitems 
    save(v) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 331, in save 
    self.save_reduce(obj=obj, *rv) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 425, in save_reduce 
    save(state) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 

    File "D:\_devs\Python01\Anaconda27\lib\site-packages\dill\dill.py", line 835, in save_module_dict 
    StockPickler.save_dict(pickler, obj) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 655, in save_dict 
    self._batch_setitems(obj.iteritems()) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 687, in _batch_setitems 
    save(v) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 

    File "D:\_devs\Python01\Anaconda27\lib\site-packages\dill\dill.py", line 835, in save_module_dict 
    StockPickler.save_dict(pickler, obj) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 655, in save_dict 
    self._batch_setitems(obj.iteritems()) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 687, in _batch_setitems 
    save(v) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 331, in save 
    self.save_reduce(obj=obj, *rv) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 425, in save_reduce 
    save(state) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 

    File "D:\_devs\Python01\Anaconda27\lib\site-packages\dill\dill.py", line 835, in save_module_dict 
    StockPickler.save_dict(pickler, obj) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 655, in save_dict 
    self._batch_setitems(obj.iteritems()) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 687, in _batch_setitems 
    save(v) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 606, in save_list 
    self._batch_appends(iter(obj)) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 642, in _batch_appends 
    save(tmp[0]) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 331, in save 
    self.save_reduce(obj=obj, *rv) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 425, in save_reduce 
    save(state) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 

    File "D:\_devs\Python01\Anaconda27\lib\site-packages\dill\dill.py", line 835, in save_module_dict 
    StockPickler.save_dict(pickler, obj) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 655, in save_dict 
    self._batch_setitems(obj.iteritems()) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 687, in _batch_setitems 
    save(v) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 331, in save 
    self.save_reduce(obj=obj, *rv) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 425, in save_reduce 
    save(state) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 

    File "D:\_devs\Python01\Anaconda27\lib\site-packages\dill\dill.py", line 835, in save_module_dict 
    StockPickler.save_dict(pickler, obj) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 655, in save_dict 
    self._batch_setitems(obj.iteritems()) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 687, in _batch_setitems 
    save(v) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 331, in save 
    self.save_reduce(obj=obj, *rv) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 425, in save_reduce 
    save(state) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 

    File "D:\_devs\Python01\Anaconda27\lib\site-packages\dill\dill.py", line 835, in save_module_dict 
    StockPickler.save_dict(pickler, obj) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 655, in save_dict 
    self._batch_setitems(obj.iteritems()) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 687, in _batch_setitems 
    save(v) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 

    File "D:\_devs\Python01\Anaconda27\lib\site-packages\dill\dill.py", line 835, in save_module_dict 
    StockPickler.save_dict(pickler, obj) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 655, in save_dict 
    self._batch_setitems(obj.iteritems()) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 687, in _batch_setitems 
    save(v) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 331, in save 
    self.save_reduce(obj=obj, *rv) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 425, in save_reduce 
    save(state) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 

    File "D:\_devs\Python01\Anaconda27\lib\site-packages\dill\dill.py", line 835, in save_module_dict 
    StockPickler.save_dict(pickler, obj) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 655, in save_dict 
    self._batch_setitems(obj.iteritems()) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 687, in _batch_setitems 
    save(v) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 

    File "D:\_devs\Python01\Anaconda27\lib\site-packages\dill\dill.py", line 835, in save_module_dict 
    StockPickler.save_dict(pickler, obj) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 655, in save_dict 
    self._batch_setitems(obj.iteritems()) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 687, in _batch_setitems 
    save(v) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 331, in save 
    self.save_reduce(obj=obj, *rv) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 425, in save_reduce 
    save(state) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 

    File "D:\_devs\Python01\Anaconda27\lib\site-packages\dill\dill.py", line 835, in save_module_dict 
    StockPickler.save_dict(pickler, obj) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 655, in save_dict 
    self._batch_setitems(obj.iteritems()) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 687, in _batch_setitems 
    save(v) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 

    File "D:\_devs\Python01\Anaconda27\lib\site-packages\dill\dill.py", line 835, in save_module_dict 
    StockPickler.save_dict(pickler, obj) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 655, in save_dict 
    self._batch_setitems(obj.iteritems()) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 687, in _batch_setitems 
    save(v) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 331, in save 
    self.save_reduce(obj=obj, *rv) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 425, in save_reduce 
    save(state) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 

    File "D:\_devs\Python01\Anaconda27\lib\site-packages\dill\dill.py", line 835, in save_module_dict 
    StockPickler.save_dict(pickler, obj) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 655, in save_dict 
    self._batch_setitems(obj.iteritems()) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 687, in _batch_setitems 
    save(v) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 

    File "D:\_devs\Python01\Anaconda27\lib\site-packages\dill\dill.py", line 993, in save_builtin_method 
    StockPickler.save_global(pickler, obj) 

    File "D:\_devs\Python01\Anaconda27\lib\pickle.py", line 759, in save_global 
    (obj, module, name)) 

PicklingError: Can't pickle <built-in function raw_input>: it's not the same object as __builtin__.raw_input 

는 확실하지 않다 :이 메시지가

import dill, pickle 

class project(object): 
    def __init__(self, name='', folder='', user_id='', version=-1): 
     self.name, self.folder, self.user_id, self.version = name, folder, user_id, version 
# Other code, not shown, since Big class ....... 

dill.dump(proj1, open('test_dill.pkl', 'w'), byref=False) 

을 코드에 의해 ...
그것은 신비한 소리.

+2

코드에'raw_input'이 없습니다 ... 아마도'...'에서 사라 졌나요? – Billy

+0

재생할 수 없습니다. '...'를 제거하고'proj1' 객체를 생성 한 후에,이 코드는 (적어도 파이썬 2에서는) 잘 동작했습니다. 문제를 나타내는 실행 파일을 게시하십시오. – tdelaney

+0

raw_input은 클래스로 작성되었으며 클래스 코드에는 표시되지 않습니다. raw_input의 목적은 무엇입니까? – Tensor

답변

0

저는 dill입니다. 다른 설정 (예 : byref)은 dump에 포함 된 개체 유형을 수정하는 데 사용됩니다. pickle 및 따라서 dill은 재귀 개체 직렬화를 사용합니다. 즉, 개체가 다른 개체를 참조 할 때 직렬화 설정에 따라 직렬화 할 수도 있고 그렇지 않을 수도 있습니다. pickle은 일반적으로 함수 및 클래스 (byref=True)으로 직렬화합니다. 즉, 가져 오기 및 이름에 대해서만 serialize됩니다. dill에는 byref=False (참조 대신 함수 및 클래스 개체를 직렬화 함)과 같은 여러 설정이 있습니다. 도 있습니다. recurse=False은 전역 참조를 직렬화하는 방법을 다루는 반면 recurse=True은 전역에있는 참조 된 항목과 해당 항목이 참조하는 항목 등을 직렬화합니다.

간단히 말해서, 직렬화하는 모든 것이 어떤 글로벌 참조를 가지며, 어떤 것이 피클 할 수없는 dill에 도달 할 때까지 재귀 직렬화를 트리거합니다.

다음은 시도 할 수있는 몇 가지 있습니다 : 별도의 파일로 파일에서

  1. 별도의 객체 -이 참조로 산세에 더 의존 할 수 있습니다.
  2. 다른 개체 (예 : recurse=True)를 사용하여 dill 개체를 대상 개체와 일련 화하려고 시도하는 개체를 변경합니다. dill.settings을 사용하여 설정을 전역 적으로 설정할 수 있습니다.
  3. 클래스에 직렬화 도우미 메서드를 추가하면 클래스를 serialize하는 방법을 pickle에게 알립니다.
  4. 직렬화 문제를 피하기 위해 클래스의 리팩토링 (어떻게 든 내용을 볼 수 없기 때문에).

오류를 보여주는 작동 예제를 게시하지 않았으므로 더 자세히 대답하기가 어렵습니다.

+0

오류 메시지 : "PicklingError : <내장 함수 raw_input>을 pickle 할 수 없습니다 : __builtin __. raw_input과 같은 개체가 아닙니다." __builtin__ 메서드가 내 클래스 생성 과정에서 변경되었음을 의미합니다. 어떻게 내장 클래스의 정의를 변경할 수 있습니까? (이상하게 보입니다). – Tensor

+0

@Tensor : 사실이 아닙니다. 그 오류를 보는 가장 일반적인 이유는 객체 ('builtin.raw_input')은 실제로 네임 스페이스에서 정의되지 않았으며 어떤 방법으로 거기에 별칭이 지정되었습니다. 객체 앨리어싱이 많이 이루어지기 때문에 이것은 매우 일반적인 산세 오류입니다. 이것이 파이썬 3이'qualname' 속성을 도입 한 이유 중 하나입니다. 불행히도'dill'은 아직 활용하지 못했습니다. –

+0

그럼 어떻게이 오류를 해결할 수 있습니까? – Tensor