擅长:python、mysql、java
<p><code>class Foo</code>必须通过unpickling环境中的同一路径导入,以便可以重新实例化pickled对象。</p>
<p>我认为您的问题是您在作为main执行的模块(<code>__name__ == "__main__"</code>)中定义了<code>Foo</code>。Pickle将序列化路径(不是类对象/定义!!!)作为主模块中的<code>Foo</code>。<code>Foo</code>不是主unpickle脚本的属性。</p>
<p>在这个例子中,您可以在unpickling脚本中重新定义<code>class Foo</code>,它应该可以很好地解除pickle。但其目的实际上是在两个脚本之间共享一个公共库,这两个脚本将通过相同的路径可用。示例:在foo.py中定义<code>Foo</code></p>
<p>简单示例:</p>
<p><strong>$项目目录/foo.py</strong></p>
<pre><code>class Foo(object):
pass
</code></pre>
<p><strong>$PROJECT目录/picklefoo.py</strong></p>
<pre><code>import cPickle
from foo import Foo
def pickleObject():
obj = Foo()
savefile = open('pickle.txt', 'w')
cPickle.dump(obj, savefile, cPickle.HIGHEST_PROTOCOL)
pickleObject()
</code></pre>
<p><strong>$PROJECT目录/unpicklefoo.py</strong></p>
<pre><code>import cPickle
savefile = open('pickle.txt', 'r')
obj = cPickle.load(savefile)
...
</code></pre>