Python Pickle 在 Windows 中加载时崩溃

标签 python io save pygame pickle

我有一个程序,它使用 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/

相关文章:

python multiprocessing - 进程终止时运行逻辑

python - 编写 Twisted 客户端以向多个 API 调用发送循环 GET 请求并记录响应

python - 为什么使用/usr/bin/env 会破坏我的 Python 导入?

haskell - 将 IO Int 转换为 Int

save - 在 PyCharm 中,如何仅保存当前文件?

matlab - 无法在 Matlab 中保存非常大的矩阵

python - 使用可变 C 数组从 C 线程调用 Python 函数

java - 扫描仪未发现线路异常

c++ - 在 haskell 的 FFI 后面使用 stdout/stderr/stdin 流

python-3.x - 如何将绘图(由 shap_values 生成)保存到 png?