Arj*_*jan 7 c++ python boost extension-modules
假设我有两个boost python模块,定义如下.模块A:
class SomeClass {
public:
SomeClass() {}
~SomeClass() {}
};
BOOST_PYTHON_MODULE(A)
{
class_<SomeClass>("SomeClass");
}
Run Code Online (Sandbox Code Playgroud)
和模块B:
class AnotherClass {
public:
AnotherClass() {}
~AnotherClass() {}
void func(SomeClass& sp) {}
};
BOOST_PYTHON_MODULE(B)
{ class_<AnotherClass>("AnotherClass")
.def("func", &AnotherClass::func)
;
}
Run Code Online (Sandbox Code Playgroud)
模块B依赖于模块A(即它使用SomeClass模块A).现在,我执行以下python脚本:
import A
import B
obj1 = A.SomeClass()
obj2 = B.AnotherClass()
obj2.func(obj1)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
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)
Run Code Online (Sandbox Code Playgroud)
似乎Python不会自动在模块之间转换类.有谁知道如何解决这个问题?
小智 7
我刚刚开始摆弄Boost.Python并遇到了同样的问题.
查看以下文档的第6部分:
http://www.boost.org/doc/libs/1_47_0/libs/python/doc/building.html
6.1 - 动态二进制
该库包含类型转换注册表.因为一个注册表在所有扩展模块之间共享,所以在一个动态加载的扩展模块中暴露给Python的类的实例可以传递给在另一个这样的模块中公开的函数.
我正在使用静态二进制文件,并获得了相同类型的错误.一旦我改为动态二进制文件,它编译并运行正常.
根据您问题中的最新回复和更新的错误消息,我认为问题可能是因为您的BOOST_PYTHON_MODULE用法可能不正确(基于我在其他使用示例中看到的内容)。尝试这样的事情,看看是否有帮助:
模块A:
class SomeClass {
public:
SomeClass() {}
~SomeClass() {}
};
BOOST_PYTHON_MODULE(A)
{
boost::python::class_<SomeClass>("SomeClass");
}
Run Code Online (Sandbox Code Playgroud)
和模块B:
class AnotherClass {
public:
AnotherClass() {}
~AnotherClass() {}
void func(SomeClass& sp) {}
};
BOOST_PYTHON_MODULE(B)
{ boost::python::class_<AnotherClass>("AnotherClass")
.def("func", &AnotherClass::func)
;
}
Run Code Online (Sandbox Code Playgroud)
请注意,在两个声明中的每一个声明中的语句中都插入了“ boost::python::”前缀。class_<...>BOOST_PYTHON_MODULE