当有多个Boost.Python模块时,挑选暴露的类

时间:2012-02-29 18:00:53

标签: python boost-python pickle

我实现了在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 __属性未正确填充此类。我找不到工作场所。我没有发现任何人有类似的问题。

感谢您提供任何帮助或建议。

1 个答案:

答案 0 :(得分:2)

根据other discussions,目前还没有解决这个问题的理想方案。但是,有一种方法可以通过在模块初始化中设置__ module __字段来“手动”解决问题。

BOOST_PYTHON_MODULE(module1)
{
  class_<MyClass, boost::noncopyable> myClass("MyClass", no_init)
    .enable_pickling();

  myClass.attr("__module__") = "module1";
}

这样,pickle将无法识别定义类的模块。