python cPickle导入错误

时间:2014-06-30 19:09:01

标签: python pickle

我正在尝试运行python项目。代码的某些部分使用以下代码调用序列化程序:

try:
    fo = open(data_file, "rb")
except IOError:
    print "Couldn't open data file: %s" % data_file
    return
try:
    myobject = pickle.load(fo)
except:
    fo.close()
    print "Unexpected error:", sys.exc_info()[0]
    raise

fo.close()
return myobject

当运行这部分代码时,我收到错误

myobject = pickle.load(fo)

错误是:

myobject = pickle.load(fo)
File "/cs/local/lib/pkg/epd-7.3.1/lib/python2.7/pickle.py", line 1378, in load
return Unpickler(file).load()
File "/cs/local/lib/pkg/epd-7.3.1/lib/python2.7/pickle.py", line 858, in load
dispatch[key](self)
File "/cs/local/lib/pkg/epd-7.3.1/lib/python2.7/pickle.py", line 1090, in load_global
klass = self.find_class(module, name)
File "/cs/local/lib/pkg/epd-7.3.1/lib/python2.7/pickle.py", line 1124, in find_class
__import__(module)
ImportError: No module named label

我看过:Import Error using cPickle in Python 但我无法使用任何解决方案,因为:

  1. “您可以二进制打开文件,并使用替换旧模块选项的模块替换选项。” =>我不知道解决方案所指的是哪个二进制文件。我的包中似乎没有任何二进制文件。

  2. 在我的包中,我没有一个名为label的模块来导入它。

    我非常迷失,我会感激任何帮助,任何建议。

1 个答案:

答案 0 :(得分:1)

当pickle序列化一个对象时,它会通过引用序列化模块。因此,如果您有一个函数或其他具有调用堆栈的python对象,它可能会引用无法找到的模块label。如果你有一个序列化的类,类实例,函数,或者特别是一个闭包......你可能在用于构建该对象的源代码中有一个import label。 pickle对象是python的一组指令,用于将二进制位信息转换为python对象。如果缺少某些位,例如模块......(pickle再次通过引用存储它),那么你的unpickle将会失败。

您可以尝试安装label模块,也可以要求序列化对象的一方使用序列化程序对其进行序列化,序列化程序将序列化模块本身而不是通过引用进行序列化。我认为您可以使用dill序列化程序执行此操作。

如果序列化对象的人在他们的label中有globals,并且有一个封闭被序列化,则pickle包含全局的所有内容......所以它可能甚至不相关,但是你&#39 ; d需要它来反序列化对象。您还可以要求序列化程序重新选择,这对于包含全局变量更为谨慎,例如dillcloudpickle

这基本上是Import Error using cPickle in Python以不太普遍的方式说的。