我正在尝试运行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 但我无法使用任何解决方案,因为:
“您可以二进制打开文件,并使用替换旧模块选项的模块替换选项。” =>我不知道解决方案所指的是哪个二进制文件。我的包中似乎没有任何二进制文件。
在我的包中,我没有一个名为label的模块来导入它。
我非常迷失,我会感激任何帮助,任何建议。
答案 0 :(得分:1)
当pickle序列化一个对象时,它会通过引用序列化模块。因此,如果您有一个函数或其他具有调用堆栈的python对象,它可能会引用无法找到的模块label
。如果你有一个序列化的类,类实例,函数,或者特别是一个闭包......你可能在用于构建该对象的源代码中有一个import label
。 pickle对象是python的一组指令,用于将二进制位信息转换为python对象。如果缺少某些位,例如模块......(pickle再次通过引用存储它),那么你的unpickle将会失败。
您可以尝试安装label
模块,也可以要求序列化对象的一方使用序列化程序对其进行序列化,序列化程序将序列化模块本身而不是通过引用进行序列化。我认为您可以使用dill
序列化程序执行此操作。
如果序列化对象的人在他们的label
中有globals
,并且有一个封闭被序列化,则pickle包含全局的所有内容......所以它可能甚至不相关,但是你&#39 ; d需要它来反序列化对象。您还可以要求序列化程序重新选择,这对于包含全局变量更为谨慎,例如dill
或cloudpickle
。
这基本上是Import Error using cPickle in Python以不太普遍的方式说的。