Как говорят документация pickle , чтобы сохранить и восстановить экземпляр класса (на самом деле тоже функцию), вы должны соблюдать определенные ограничения:
рассол может сохранить и восстановить класс
случаи прозрачно, однако
определение класса должно быть импортируемым
и жить в том же модуле, что и когда
объект хранился
whyteboard.tools
- это , а не «тот же модуль, что и» tools
(даже если он может быть импортирован import tools
другими модулями в том же пакете, он заканчивается в sys.modules
как sys.modules['whyteboard.tools']
: это абсолютно важно, в противном случае один и тот же модуль, импортируемый одним в том же пакете, чем один в другом пакете, будет иметь несколько и, возможно, конфликтующие записи!).
Если ваши файлы Pickle имеют хороший / расширенный формат (в отличие от старого формата ASCII, который используется по умолчанию только из соображений совместимости), перенос их после внесения таких изменений может на самом деле не быть вполне столь же тривиально, как «редактирование файла» (которое является двоичным и т. д.!), несмотря на то, что предлагает другой ответ. Я предлагаю вместо этого сделать небольшой «сценарий переноса рассола»: пусть он исправит sys.modules
вот так ...:
import sys
from whyteboard import tools
sys.modules['tools'] = tools
, а затем cPickle.load
каждый файл, del sys.modules['tools']
и cPickle.dump
каждый загруженный объект обратно в файл: эта временная дополнительная запись в sys.modules
должна позволить успешно загружать огурчики, а затем выгрузить их снова следует с помощью имя модуля для классов экземпляров (необходимо убрать эту дополнительную запись).