我有一个程序,它使用 Pickle 从磁盘保存和加载对象。 pickle 的保存和加载如下所示:
def saveData(self,obj):
f = open(os.path.join(self.directory,obj.name),'wb')
pickle.dump(obj, f)
def loadData(self,fname):
f = open(os.path.join(self.directory,fname),'rb')
ret = pickle.load(f)
return ret
我有一个测试方法,它可以简单地创建一个对象,保存它,然后立即加载它。在 Linux 中,该对象工作正常,但在 Windows 中,程序在尝试加载该对象时崩溃。我已经在 Windows 中重新制作了 pickle 文件,因此它不会尝试打开 Linux 对象转储(尽管如果有办法进行跨平台 pickling,我想知道)
什么可能导致该程序在 Windows 中崩溃而不是在 Linux 中崩溃?
最佳答案
Pickle 基本上只存储对象的属性和重新创建它的类名。
如果您碰巧有一个 C/C++ 包装对象,则属性可能包含指向内存位置的指针(也称为 C 指针)。因此,如果您 pickle 该对象,销毁旧对象并恢复它,则指针指向无效的地方。如果在 unpickle 过程中使用这些,则会发生崩溃。崩溃将发生在一个操作系统或另一个操作系统上,具体取决于内存管理器如何重用该地址。 Windows 似乎更渴望免费的东西。
那么,某些扩展对象会发生这种情况吗?对于纯 python 类来说,这种情况不应该发生。
关于Python Pickle 在 Windows 中加载时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29854001/