python - 如何在 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”所做的那样?
解决方案
推荐阅读
- c++ - C++:为什么程序可以正常执行而没有任何错误?
- azure - 通过Powershell转换excel中的json值
- javascript - Salesforce 中自定义对象字段的动态收件人与 DocuSign 集成
- python - 使用 range() 和 step 进行字典理解
- python - 如何在多处理中关闭硒浏览器?
- multithreading - Hanging in channel receiver iterator in Rust?
- verilog - 来自多个 if 语句的信号分配
- android - Android 应用内评分提示提交按钮和星在生产应用上被禁用
- xpath - 为具有几乎相同属性的超链接选择正确的 xpath
- javascript - Redux Saga 错误:takeLatest$1 需要模式或通道