这个问题是Python 问题 3675 。这个错误实际上已在 Python 3.11 中修复。
如果我们导入:
from lib2to3.fixes.fix_imports import MAPPING
MAPPING 将 Python 2 名称映射到 Python 3 名称。我们想要反过来。
REVERSE_MAPPING={}
for key,val in MAPPING.items():
REVERSE_MAPPING[val]=key
我们可以覆盖 Unpickler 并加载
class Python_3_Unpickler(pickle.Unpickler):
"""Class for pickling objects from Python 3"""
def find_class(self,module,name):
if module in REVERSE_MAPPING:
module=REVERSE_MAPPING[module]
__import__(module)
mod = sys.modules[module]
klass = getattr(mod, name)
return klass
def loads(str):
file = pickle.StringIO(str)
return Python_3_Unpickler(file).load()
然后我们将其称为负载而不是 pickle.loads。
这应该可以解决问题。