【问题标题】:TypeError: can't pickle PyCapsule objectsTypeError:无法腌制 PyCapsule 对象
【发布时间】:2018-12-21 10:40:35
【问题描述】:

我使用dill 将 ML 模型保存到文件。

当我使用 python -m unittest 运行测试时,它可以工作。但是,如果我尝试使用 python setup.py test 运行测试,它会在我尝试保存模型的原始数据中出现错误 TypeError: can't pickle PyCapsule objects

我在 setup.py 中的测试设置:

test_suite='tests', tests_require=['pytest']

错误:

  File "/Users/anna/anaconda3/lib/python3.6/site-packages/dill/_dill.py", line 1055, in save_builtin_method
    pickler.save_reduce(_get_attr, (module, obj.__name__), obj=obj)
  File "/Users/anna/anaconda3/lib/python3.6/pickle.py", line 610, in save_reduce
    save(args)
  File "/Users/anna/anaconda3/lib/python3.6/pickle.py", line 476, in save
    f(self, obj) # Call unbound method with explicit self
  File "/Users/anna/anaconda3/lib/python3.6/pickle.py", line 736, in save_tuple
    save(element)
  File "/Users/anna/anaconda3/lib/python3.6/pickle.py", line 476, in save
    f(self, obj) # Call unbound method with explicit self
  File "/Users/anna/anaconda3/lib/python3.6/site-packages/dill/_dill.py", line 1260, in save_module
    state=_main_dict)
  File "/Users/anna/anaconda3/lib/python3.6/pickle.py", line 634, in save_reduce
    save(state)
  File "/Users/anna/anaconda3/lib/python3.6/pickle.py", line 476, in save
    f(self, obj) # Call unbound method with explicit self
  File "/Users/anna/anaconda3/lib/python3.6/site-packages/dill/_dill.py", line 893, in save_module_dict
    StockPickler.save_dict(pickler, obj)
  File "/Users/anna/anaconda3/lib/python3.6/pickle.py", line 821, in save_dict
    self._batch_setitems(obj.items())
  File "/Users/anna/anaconda3/lib/python3.6/pickle.py", line 847, in _batch_setitems
    save(v)
  File "/Users/anna/anaconda3/lib/python3.6/pickle.py", line 496, in save
    rv = reduce(self.proto)
TypeError: can't pickle PyCapsule objects

你能帮我知道为什么它不起作用吗?

【问题讨论】:

  • 你找到解决办法了吗?

标签: python unit-testing pickle setup.py dill


【解决方案1】:

我是dill 作者。这是dill 的一个已知未解决问题。请参阅:https://github.com/uqfoundation/dill/issues/106。本质上,PyCapsule 对象的序列化函数尚未在dill 中注册。

【讨论】:

  • 您介意发布解决方法的示例吗?我正在尝试将一个方法从 PyCapsule 类发送到池 - 我不完全确定如何使用您在票证末尾提供的链接中的所述指针方法来执行此操作。
  • 谢谢,我会努力的,如果有什么我会发帖的。
  • 我对这个答案的困惑是我的对象甚至看起来不是 PyCapsule,也不包含一个。我猜类对象确实包含几个字典,但我只是不明白我的违规组件是什么导致了这个问题。我在 python 3.7.0,受 Blender 2.80 候选版本 2 的强制。
  • @ofloveandhate:如果您的对象不是机器学习模型,那么我希望它应该是一个不同的问题......并且会尝试序列化不同的对象。通常,您不会看到 PyCapsule 对象。发布一个新的 SO 问题。
  • @MikeMcKerns 从dill 0.3.1.1 版开始,这个问题似乎与numpy >1.16.4 版本有关,显然,对 np.arange(3) 的挖掘提供了错误,但不是列表 [0,1,2] 的挖掘。
猜你喜欢
  • 2017-10-23
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-14
  • 2020-04-07
相关资源
最近更新 更多