python cPickle 导入错误

-1 投票
1 回答
3256 浏览
提问于 2025-04-18 11:37

我正在尝试运行一个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

我查看了这个链接:在Python中使用cPickle时的导入错误,但我无法使用任何解决方案,因为:

  1. “你可以以二进制方式打开文件,并用你替换旧模块选项的模块替换选项。” => 我不知道这个解决方案提到的是哪个二进制文件。我在我的包里似乎没有任何二进制文件。

  2. 在我的包中,我没有名为label的模块可以导入。

    我感到非常迷茫,非常希望能得到任何帮助或建议。

1 个回答

1

当使用pickle来保存一个对象时,它是通过引用来保存模块的。所以如果你有一个函数或者其他的Python对象,它可能会引用一个叫做label的模块,但这个模块可能找不到。如果你有一个被保存的类、类的实例、函数,或者特别是一个闭包……你可能在构建这个对象的源代码中有一个import label。被保存的对象其实是一组指令,告诉Python如何把一堆二进制信息变成一个Python对象。如果有一些信息缺失,比如某个模块……(pickle是通过引用来存储的),那么在恢复这个对象时就会失败。

你可以尝试安装label模块,或者请保存这个对象的人用一种可以直接保存模块本身的方式来重新保存这个对象,而不是通过引用的方式。我觉得你可以用dill这个工具来做到这一点。

如果保存对象的人在他们的globals中有label,而且有一个闭包被保存了,pickle会把所有的全局变量都包括进去……所以这可能并不重要,但你需要这个模块来恢复对象。你也可以请求用一种更小心的方式重新保存,比如使用dillcloudpickle,它们会更注意包含全局变量。

这基本上就是在说在Python中使用cPickle时的导入错误的内容,只是说得更具体一些。

撰写回答