Dill/Pickling错误:集合项目的奇数



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

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

pickle.UnpicklingError:SET items 的奇数项目

我以前从未见过这种情况,所以我查看了源代码。请参见此处: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.multiarrayn_reconstructnp0n(cnumpynndarraynp1n(I0ntp2nS'b'np3ntp4nRp5n(I1n(I1ntp6ncnumpyndtypenp7n(S'i8'np8nI0nI1ntp9nRp10n(I3nS'<'np11nNNNI-1nI-1nI0ntp12nbI00nS'\x01\x00\x00\x00\x00\x00\x00\x00'np13ntp14nb."
>>> p.dump(y)
>>> f.getvalue()
"cnumpy.core.multiarrayn_reconstructnp0n(cnumpynndarraynp1n(I0ntp2nS'b'np3ntp4nRp5n(I1n(I1ntp6ncnumpyndtypenp7n(S'i8'np8nI0nI1ntp9nRp10n(I3nS'<'np11nNNNI-1nI-1nI0ntp12nbI00nS'\x01\x00\x00\x00\x00\x00\x00\x00'np13ntp14nb.(g5ntp15n."
>>> dill.loads(_)
array([1])
>>> 
import dill
import numpy as np
x = np.array([1])
y = (x,)
dill.dumps(x)
dill.loads(dill.dumps(y))

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

最新更新