Dill:导入后,unpickling 产生segmentation fault;什么可能的事情可能会出错?

Dill: After import, unpickling yields segmentation fault; what possible things could be going wrong?

最近,我在 Macbook Pro 上升级到 Big Sur,安装了 python3.9 brew。我使用虚拟环境进行开发。

我有一个莳萝腌制的物品,我在这台机器上用新的虚拟机重新腌制过。在导入任何东西之前,我可以解开该项目:

Python 3.9.6 (default, Jun 29 2021, 06:20:32)
[Clang 12.0.0 (clang-1200.0.32.29)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import dill
>>> with open('item.pkl','rb') as pklstream:
...     item = dill.load(pklstream)
...
>>> item
<Foo object at 0x10d02eac0>
>>> quit()


(venv) $ python3
Python 3.9.6 (default, Jun 29 2021, 06:20:32)
[Clang 12.0.0 (clang-1200.0.32.29)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import dill
>>> from skimage.morphology import thin
>>> with open('item.pkl','rb') as pklstream:
...     item = dill.load(pklstream)
...
Segmentation fault: 11
(venv)$

这发生在 skimage 和一些不相关的本地模块上。我能说的最好的是,当 pickle 被导入到这个系统中时,有一些潜在的依赖性正在改变 pickle 的工作方式。

我不明白这里的自由度 -- 什么可以改变?什么是无法改变的?

这个错误可能出现在哪里?


由于 Mac 方面的所有内容或多或少都是通过 Brew 进行的自定义安装,因此我很难完美地重新安装和重新缓存所有内容。

也许我可以明确设置一些设置来覆盖导入引起的任何隐式行为?

我是 dill 作者。我期望发生的事情是 dill 正在写入 pickle dispatch table (注册新的对象类型它了解如何 pickle),并且 skimage 也在做同样的事情......并且正在用不兼容的东西替换序列化对象的依赖项之一。因此,根据首次导入任一包的顺序,它会导致不同的 pickle 注册表状态(它是映射到序列化函数的类型字典)。

dill 试图通过 dill.extend 为您提供解决方法。因此,您可以使用 dill.extend(False) 从注册表中删除 dill 注册的类型,然后使用 dill.extend(True).

(重新)注入它们

我不能确定这会解决你所看到的问题,因为你没有一个独立的工作示例——但这是唯一对我来说支持正在发生的事情的事情.

对于您知道在注册表中存在冲突的对象,也可以避免其中一些问题...如果您可以在 [=19= 之前使用 dill 序列化变体之一] 有问题的对象。因此,例如,设置 dill.settings['recurse'] = True 也可能存储您的对象,但不会具有相同的序列化依赖性,因此可能不会受到注册表中相同冲突​​的影响。