0

我有一个非常奇怪的错误,除了我的生产环境之外无法在任何地方重现。这个错误是什么意思?当我尝试运行以下代码时,我明白了:

  serialized_object = dills.dumps(object)
  dill.loads(serialized_object)

pickle.UnpicklingError:SET ITEMS 的奇数个项目

4

2 回答 2

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])
>>> 
于 2016-05-10T12:32:16.897 回答
0
import dill
import numpy as np

x = np.array([1])

y = (x,)

dill.dumps(x)

dill.loads(dill.dumps(y))

这将引发 out of index 异常。原因是因为注册了一个特殊的函数来序列化numpy数组对象。该特殊函数使用全局 Pickler 来存储序列化数据,而不是作为参数传递的 Pickler。为了解决这个问题,我使用了传递给参数的 Pickler。我不确定它是否会破坏莳萝中的其他任何东西。

于 2016-06-10T18:51:23.697 回答