我正在尝试在一个模块中挑选一个类的实例,并在另一个模块中解开它。
这是我挑选的地方:
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'
任何人都能看到我做错了什么?
答案 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
存在于每段代码的相同名称空间中。