Я пытаюсь обработать экземпляр класса в одном модуле, и
Вот где я солю:
import cPickle
def pickleObject():
object = Foo()
savefile = open('path/to/file', 'w')
cPickle.dump(object, savefile, cPickle.HIGHEST_PROTOCOL)
class Foo(object):
(...)
, а вот где я пытаюсь распаковать:
savefile = open('path/to/file', 'r')
object = cPickle.load(savefile)
Во второй строке я получаю AttributeError: объект 'module' не имеет атрибута 'Foo'
Кто-нибудь видит, что я делаю неправильно?
Класс Foo
должен быть доступен для импорта по тому же пути в среде распаковки, чтобы можно было воссоздать обработанный объект.
Я думаю, ваша проблема в том, что вы определяете Foo
в модуле, который вы выполняете как основной (__name__ == "__main__"
). Pickle сериализует путь (не объект/определение класса!!!) к Foo
как находящийся в основном модуле. Foo
не является атрибутом основного сценария распаковки.
В этом примере вы можете переопределить класс Foo
в скрипте распаковки, и он должен распаковываться нормально. Но на самом деле цель состоит в том, чтобы иметь общую библиотеку, совместно используемую двумя сценариями, которые будут доступны по одному и тому же пути. Пример: определите Foo
в foo.py
Простой пример:
$PROJECT_DIR/foo.py
class Foo(object):
pass
$PROJECT_DIR/picklefoo.py
import cPickle
from foo import Foo
def pickleObject():
obj = Foo()
savefile = open('pickle.txt', 'w')
cPickle.dump(obj, savefile, cPickle.HIGHEST_PROTOCOL)
pickleObject()
$PROJECT_DIR/unpicklefoo.py
import cPickle
savefile = open('pickle.txt', 'r')
obj = cPickle.load(savefile)
...
Джереми Браун дал правильный ответ, вот более конкретный версия той же точки:
import cPickle
import myFooDefiningModule
def pickleObject():
object = myFooDefiningModule.Foo()
savefile = open('path/to/file', 'w')
cPickle.dump(object, savefile)
и:
import cPickle
import myFooDefiningModule
savefile = open('path/to/file', 'r')
object = cPickle.load(savefile)
такая, что Foo
живет в одном и том же пространстве имен в каждом фрагменте кода.