我试图在一个模块中选取一个类的实例,然后在另一个模块中取消对它的选取。
我在这里泡菜:
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'
有人知道我做错了什么吗?
杰里米·布朗(Jeremy Brown)的回答是对的,这里有一个更具体的说法:
以及:
使
Foo
在每段代码中都位于同一名称空间中。class Foo
必须通过unpickling环境中的同一路径导入,以便可以重新实例化pickled对象。我认为您的问题是您在作为main执行的模块(
__name__ == "__main__"
)中定义了Foo
。Pickle将序列化路径(不是类对象/定义!!!)作为主模块中的Foo
。Foo
不是主unpickle脚本的属性。在这个例子中,您可以在unpickling脚本中重新定义
class Foo
,它应该可以很好地解除pickle。但其目的实际上是在两个脚本之间共享一个公共库,这两个脚本将通过相同的路径可用。示例:在foo.py中定义Foo
简单示例:
$项目目录/foo.py
$PROJECT目录/picklefoo.py
$PROJECT目录/unpicklefoo.py
相关问题 更多 >
编程相关推荐