用dill序列化SWIG扩展 最近,我被要求让“我们的C++ LIB在云中工作”。 基本上,lib是计算机密集型的(计算价格),因此它是有意义的。 我构建了一个SWIG接口来制作一个python版本,以便在MRJob中使用MapReduce。 我想序列化文件中的对象,并使用映射器反序列化和计算价格
例如:用dill序列化SWIG扩展 最近,我被要求让“我们的C++ LIB在云中工作”。 基本上,lib是计算机密集型的(计算价格),因此它是有意义的。 我构建了一个SWIG接口来制作一个python版本,以便在MRJob中使用MapReduce。 我想序列化文件中的对象,并使用映射器反序列化和计算价格,python,c++,hadoop,serialization,dill,Python,C++,Hadoop,Serialization,Dill,例如: class MRTest(MRJob): def mapper(self,key,value): obj = dill.loads(value) yield (key, obj.price()) 但现在我走到了死胡同,因为dill似乎无法处理SWIG扩展: PicklingError: Can't pickle <class 'SwigPyObject'>: it's not found as builtins.SwigPyObjec
class MRTest(MRJob):
def mapper(self,key,value):
obj = dill.loads(value)
yield (key, obj.price())
但现在我走到了死胡同,因为dill似乎无法处理SWIG扩展:
PicklingError: Can't pickle <class 'SwigPyObject'>: it's not found as builtins.SwigPyObject
PicklingError:无法pickle:未将其作为内置项找到。SwigPyObject
有什么方法可以让它正常工作吗?我是dill的作者。没错,<代码> dIL<代码>不能泡汤C++对象。当您看到
它不是内置的。
某个对象……这几乎总是意味着您试图pickle某个不是用python编写的对象,而是使用python绑定到C/C++(即扩展类型)。您不希望用python序列化程序直接处理此类对象
但是,由于您对pickle扩展类型的子类感兴趣,因此实际上可以这样做。您需要做的就是为对象提供一个或多个要另存为实例属性的适当状态,并提供一个\uuuu reduce\uuuuu
方法告诉dill
(或pickle
)如何保存对象的状态。这个方法就是python处理序列化扩展类型的方法。见:
可能有更好的例子,但这里至少有一个例子: