2016-11-22 2 views
0

При использовании dill сериализовать класс:укропа/выпуск рассола со встроенной функцией

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) 

Я получаю сообщение:

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 

не уверен, чем встроенные функции могут быть изменены по коду ...
Звучит загадочно.

+2

В коде отсутствует 'raw_input' ... возможно, он потерян в' ... '? – Billy

+0

Невозможно воспроизвести. После удаления '......' и создания объекта 'proj1' этот код работал нормально (по крайней мере, на python 2). Пожалуйста, напишите что-нибудь runnable, которое демонстрирует проблему. – tdelaney

+0

raw_input построен в классе, не показанном в коде класса. Какова цель raw_input? – Tensor

ответ

0

Я - dill автор. Различные настройки (например, byref) используются для изменения типов объектов, включенных в dump. pickle и, следовательно, dill, используйте сериализацию рекурсивных объектов, что означает, что когда объект ссылается на другой объект, он может (или не должен) сериализовать его на основе параметров сериализации. pickle обычно сериализует функции и классы по ссылке (byref=True), что означает, что они только сериализуются при импорте и по имени. dill имеет несколько настроек, таких как byref=False (который сериализует функции и объекты класса вместо ссылки). Существует также recurse, в котором описывается, как глобальные ссылки сериализованы. recurse=False сериализует все глобальные переменные как dict, а recurse=True сериализует только ссылочные позиции в глобальных элементах и ​​элементах, к которым относятся эти элементы и т. Д.

Короче говоря, все, что вы сериализуете, имеет некоторые глобальные ссылки, которые вызывают рекурсивную сериализацию до тех пор, пока она не ударит что-то. dill не может рассолить.

Вот некоторые вещи, которые вы можете попробовать:

  1. Отдельные объекты в файле в отдельные файлы - это позволяет в большей степени полагаться на травление по ссылке.
  2. Используйте различные настройки, например recurse=True, чтобы изменить, какие объекты dill пытается сериализовать ваш целевой объект. Вы можете установить глобальные настройки с помощью dill.settings.
  3. Добавить методы сериализации для вашего класса, которые сообщают pickle, как сериализовать ваш класс.
  4. Рефакторинг вашего класса (так или иначе, так как я не вижу его содержимого), чтобы избежать проблем с сериализацией.

Трудно ответить более подробно, так как вы не опубликовали рабочий пример, демонстрирующий ошибку.

+0

Сообщение об ошибке говорит: «PicklingError: не может pickle <встроенная функция raw_input>: это не тот же объект, что и __builtin __. Raw_input». это означает, что метод __builtin__ был изменен в процессе генерации моего класса. Как я могу изменить определение Built in class? (это выглядит странно). – Tensor

+0

@ Тензор: Неправда. Наиболее распространенной причиной того, что эта ошибка является, является то, что объект ('builtin.raw_input' в этом случае) на самом деле не определен в этом пространстве имен и там каким-то образом были сфальсифицированы. Это очень распространенная ошибка травления, поскольку сглаживание объектов сделано много. Это одна из причин того, что python 3 представил атрибут «qualname», который, к сожалению, «dill» еще не использует. –

+0

Итак, как я могу решить эту ошибку? – Tensor