我有一个非常奇怪的错误,除了我的生产环境之外无法再现。这个错误是什么意思?当我尝试运行以下代码时,我得到它:
serialized_object = dills.dumps(object)
dill.loads(serialized_object)
pickle.UnpicklingError:SET ITEMS的奇数项目
答案 0 :(得分:1)
我以前从未见过这个,所以我查看了源代码。看到这里:https://github.com/python/cpython/blob/f24143b25e4f83368ff6182bebe14f885073015c/Modules/_pickle.c#L5914似乎暗示你有一个腐败或敌对的泡菜。
根据OP的评论,我认为我看到了解决方法。我将不得不确定变通方法的影响,并且必须将其集成到dill
中,但现在它是:
>>> import StringIO as io
>>> f = io.StringIO()
>>> import dill
>>> import numpy as np
>>> x = np.array([1])
>>> y = (x,)
>>> p = dill.Pickler(f)
>>> p.dump(x)
>>> f.getvalue()
"cnumpy.core.multiarray\n_reconstruct\np0\n(cnumpy\nndarray\np1\n(I0\ntp2\nS'b'\np3\ntp4\nRp5\n(I1\n(I1\ntp6\ncnumpy\ndtype\np7\n(S'i8'\np8\nI0\nI1\ntp9\nRp10\n(I3\nS'<'\np11\nNNNI-1\nI-1\nI0\ntp12\nbI00\nS'\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00'\np13\ntp14\nb."
>>> p.dump(y)
>>> f.getvalue()
"cnumpy.core.multiarray\n_reconstruct\np0\n(cnumpy\nndarray\np1\n(I0\ntp2\nS'b'\np3\ntp4\nRp5\n(I1\n(I1\ntp6\ncnumpy\ndtype\np7\n(S'i8'\np8\nI0\nI1\ntp9\nRp10\n(I3\nS'<'\np11\nNNNI-1\nI-1\nI0\ntp12\nbI00\nS'\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00'\np13\ntp14\nb.(g5\ntp15\n."
>>> dill.loads(_)
array([1])
>>>
答案 1 :(得分:0)
import dill
import numpy as np
x = np.array([1])
y = (x,)
dill.dumps(x)
dill.loads(dill.dumps(y))
这将抛出索引异常。原因是因为有一个特殊的函数被注册来序列化numpy数组对象。该特殊函数使用全局Pickler来存储序列化数据,而不是作为参数传递的Pickler。为了解决这个问题,我使用了传递给参数的Pickler。我不确定它是否会破坏莳萝中的任何其他东西。