AttributeError при извлечении объекта

Я пытаюсь обработать экземпляр класса в одном модуле, и

Вот где я солю:

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'

Кто-нибудь видит, что я делаю неправильно?

16
задан Max 1 September 2010 в 01:10
поделиться

2 ответа

Класс 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)
...
22
ответ дан 30 November 2019 в 21:35
поделиться

Джереми Браун дал правильный ответ, вот более конкретный версия той же точки:

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 живет в одном и том же пространстве имен в каждом фрагменте кода.

3
ответ дан 30 November 2019 в 21:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: