首页 > 解决方案 > 如何在 Python 中使用 copy_reg.pickle 注册类型“SwigPyObject”?

问题描述

我有一个类方法,我想将它与 multiprocessing.Pool 一起用于并行化。由于类实例不可腌制,我使用了以下内容:

import copy_reg
import types

def _reduce_method(m):
    if m.im_self is None:
        return getattr, (m.im_class, m.im_func.func_name)
    else:
        return getattr, (m.im_self, m.im_func.func_name)

copy_reg.pickle(types.MethodType, _reduce_method)

这没问题。但是,在我的课堂上,我使用 GDAL 模块 ( https://pypi.org/project/GDAL/ ) 来处理地理空间图像和数据。所以现在,我收到以下错误:

cPickle.PicklingError: Can't pickle <type 'SwigPyObject'>: attribute lookup __builtin__.SwigPyObject failed

我正在使用 Python 2.7.10。我知道我可以使用 Python 3 或使用 Pathos 而不是 Multiprocessing 来解决我的 Pool 问题,但是由于我的机器上的网络限制,我不能轻松地完成其中任何一个。

我花了一些时间寻找解决方案,但无济于事。我找到了一些潜在的解决方案(例如,如何使我的 SWIG 扩展模块与 Pickle 一起使用?)但我不确定如何实现它们,因为我没有故意在我的代码中创建一个 SWIG 对象,但它必须进来在某些时候由于GDAL。

有没有一种方法可以使用 copy_reg 将类型“SwigPyObject”注册为 pickleable,就像我在上面使用类型“instancemethod”所做的那样?

标签: pythonmultiprocessingpickleswiggdal

解决方案


推荐阅读