取消对象的取消时的AttributeError

时间:2010-09-01 01:10:29

标签: python pickle

我正在尝试在一个模块中挑选一个类的实例,并在另一个模块中解开它。

这是我挑选的地方:

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' object has no attribute 'Foo'

任何人都能看到我做错了什么?

2 个答案:

答案 0 :(得分:21)

class Foo必须可以通过unpickling环境中的相同路径导入,以便可以重新实例化pickle对象。

我认为您的问题是您在作为主要执行的模块中定义Foo__name__ == "__main__")。 Pickle会将路径(不是类对象/定义!!!)序列化为Foo,因为它位于主模块中。 Foo不是主要unpickle脚本的属性。

在这个例子中,您可以在unpickling脚本中重新定义class Foo,它应该是非常好的。但目的是要在两个脚本之间共享一个公共库,这些脚本将由同一路径提供。示例:在foo.py中定义Foo

简单示例:

<强> $ 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)
...

答案 1 :(得分:3)

杰里米·布朗有正确的答案,这是同一点的更具体的版本:

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存在于每段代码的相同名称空间中。