取消拾取对象时发生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' object has no attribute 'Foo'
有人看到我在做什么错吗?
-
class Foo
必须在解酸环境中通过相同的路径导入,以便可以重新实例化酸洗的对象。我认为您的问题是您
Foo
在要作为main(__name__ == "__main__"
)执行的模块中定义。Pickle会将路径(而不是类object
/ definition !!!)序列化为Foo
位于主模块中。Foo
不是主要打开脚本的属性。在此示例中,您可以重新定义
class 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) ...