Как можно зарегистрировать тип SwigPyObject, используя copy_reg.pickle в Python? - PullRequest
0 голосов
/ 26 июня 2018

У меня есть метод класса, который я хотел бы использовать с 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 вместо многопроцессорной обработки, но я не могу легко выполнить ни одно из этих действий из-за сетевых ограничений на моем компьютере.

Я потратил немного времени на поиск решения, но безрезультатно. Я нашел некоторые потенциальные решения (например, Как заставить мой модуль расширения SWIG работать с Pickle? ), но я не уверен, как их реализовать, так как я не намеренно создаю объект SWIG в своем коде , но это должно прийти в какой-то момент из-за GDAL.

Есть ли способ зарегистрировать тип 'SwigPyObject' как с возможностью копирования с использованием copy_reg, как я делал с типом 'instancemethod' выше?

...