import pickle
with open('stage.pkl', 'wb') as f:
pickle.dump(obj, f, protocol=4)
离线任务用 Python 3.8 的 pickle.dump 存了中间结果,默认 protocol 是 5,换到另一台 Python 3.7 的机器上加载,直接报 ValueError: unsupported pickle protocol: 5。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:pickle 的协议版本跟解释器绑定,高版本写出的字节流低版本读不了。dump 不传 protocol 时用的是当前解释器的默认值,跨机器就暴露了。
「pickle 协议版本」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。
把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。
验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
处理上按这个顺序:dump 时显式指定 protocol=4 兼容到 Python 3.4;确认上下游机器的 Python 版本 统一到一个范围;改用 json 或 parquet 存中间结果 避开字节流绑定;历史文件用高版本机器重新导出一份。
确认没问题再收工,Python 3.7 环境能正常 loads 不再报 unsupported pickle protocol。
