如何找出/打印使用哪个版本的协议生成了 pickle 文件

How can I find out / print with which version of the protocol a pickle file has been generated

在某些情况下,当我加载一个现有的 pickle 文件,然后再次转储它时,大小几乎减半。

不知为何,首先怀疑是协议版本问题。 我能以某种方式找出文件是用哪个协议版本腌制的吗?

可能有更优雅的方法,但要深入了解金属,您可以使用 pickletools:

import pickle
import pickletools
s = pickle.dumps('Test')
proto_op = next(pickletools.genops(s))
assert proto_op[0].name == 'PROTO'
proto_ver = proto_op[1]

要确定解码所需的版本,您需要每个操作码的最大协议版本:

proto_ver = max(op[0].proto for op in pickletools.genops(s))