我实现了在boost的帮助下将一些C ++类暴露给python。我定义了两个与我的应用程序静态链接的不同模块。我可以使用那些模块中定义的类,派生它们等等。
BOOST_PYTHON_MODULE(module1)
{
class_<MyClass, boost::noncopyable>("MyClass", no_init)
.enable_pickling();
}
然而,由于与泡菜无关的错误,我无法腌制它们。我的类的__ module __属性不正确。因此,泡菜不能让班级回来。如果我的两个python模块是“module1”和“module2”,并且module1定义了一个类名MyClass,则代码如下:
print(module1.MyClass.__name__)
print(module1.MyClass.__module__)
pickle.dumps(module1.MyClass,0)
将输出
MyClass
module2
Traceback (most recent call last):
File "main.py", line 23, in <module>
pickle.dumps(module1.MyClass,0)
_pickle.PicklingError: Can't pickle <class 'module2.MyClass'>: attribute lookup
module2.MyClass failed
它证明__ module __属性未正确填充此类。我找不到工作场所。我没有发现任何人有类似的问题。
感谢您提供任何帮助或建议。
答案 0 :(得分:2)
根据other discussions,目前还没有解决这个问题的理想方案。但是,有一种方法可以通过在模块初始化中设置__ module __字段来“手动”解决问题。
BOOST_PYTHON_MODULE(module1)
{
class_<MyClass, boost::noncopyable> myClass("MyClass", no_init)
.enable_pickling();
myClass.attr("__module__") = "module1";
}
这样,pickle将无法识别定义类的模块。