假设我有两个boost
python模块,定义如下.模块A:
class SomeClass { public: SomeClass() {} ~SomeClass() {} }; BOOST_PYTHON_MODULE(A) { class_<SomeClass>("SomeClass"); }
和模块B:
class AnotherClass { public: AnotherClass() {} ~AnotherClass() {} void func(SomeClass& sp) {} }; BOOST_PYTHON_MODULE(B) { class_<AnotherClass>("AnotherClass") .def("func",&AnotherClass::func) ; }
模块B依赖于模块A(即它使用模块A中的SomeClass).现在,我执行以下python脚本:
import A import B obj1 = A.someClass() obj2 = B.AnotherClass() obj2.func(obj1)
我收到以下错误:
Traceback (most recent call last): File "C:\bladiebla\script.py",line 8,in <module> obj2.func(obj1) ArgumentError: Python argument types in AnotherClass.func(AnotherClass,SomeClass) did not match C++ signature: func(class AnotherClass {lvalue},class SomeClass)
似乎Python不会自动在模块之间转换类.有谁知道如何解决这个问题?
解决方法
我刚刚开始摆弄Boost.Python并遇到同样的问题.
查看以下文档的第6部分:
http://www.boost.org/doc/libs/1_47_0/libs/python/doc/building.html
6.1 – 动态二进制
该库包含类型转换注册表.因为一个注册表在所有扩展模块之间共享,所以在一个动态加载的扩展模块中暴露给Python的类的实例可以传递给在另一个这样的模块中公开的函数.
我使用的是静态二进制文件,并获得了相同类型的错误.一旦我改为动态二进制文件,它编译并运行正常.