我正在努力使用boost构建一个c ++ python包装器。这可能是一个非常基本的问题,但我没有在各种现有教程中看到答案。
[更新:关于如何访问struct数据成员的第一部分是由xioxox发布的。仍然存在的问题是: 如何在struct中为vector创建包装器。]
[原帖] 我的C ++部分看起来像这样:
struct Globals {
AClass *a;
BClass *b;
int someInt = 5;
bool check = FALSE;
vector<unsigned short> someData
};
void func1(Globals* global)
{
// ...
// a propper inizialisation of the globals a and b Classes
// ...
global->check = global->a->returnSomething1(global->someInt);
if(global->check)
{
global->someData = global->b->returnSomething2();
}
return;
}
BOOST_PYTHON_MODULE(demo)
{
using namespace boost::python;
class_<Globals>("Globals")
.def_readonly("check", &Globals::check)
.def_readwrite("someint", &Globals::someint);
//someData to be done...
def("func1", func1);
}
使用Python我想创建一个Globals
对象,在其中设置someInt
,然后将其传递给func1
。函数完成后我想读取check
值,如果是,则结果再次通过python保存在someData
中。
当我在IPython控制台中导入libary时,它会给出以下结果
In [1]: import demo as d
In [2]: T = d.Globals
In [3]: T
Out[3]: demo.Globals
In [4]: T.check
Out[4]: <property at 0xa2c72c8>
In [5]: T.someInt
Out[5]: <property at 0xa2c7278>
In [6]: T.someInt = 5
In [7]: d.func1(T)
Out[7]: <property at 0xa2c7278>
Traceback (most recent call last):
File "<ipython-input-7-dc39ba21a63e>", line 1, in <module>
demo.func1(T)
ArgumentError: Python argument types in demo.func1(Boost.Python.class)
did not match C++ signature:
func1(struct Globals * __ptr64)
当我尝试访问这些值时,我只看到C ++指针。然而,根据我的理解,结构被更改为Boost.Python.class
,我必须从此类获取指针并将其作为Globals*
输入传递。我怎么做?
我也想在python中访问Vector数据(sapGlobal->images.data()
),但我不知道如何为它实现包装。
对此的任何帮助都将受到高度赞赏。
[update 2]可以通过包含#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
来包装向量
并将以下行添加到BOOST_PYTHON_MODULE
class_<vector<unsigned short>>("img")
.def(vector_indexing_suite<vector<unsigned short>>());
如上所述here
答案 0 :(得分:1)
问题在于T实际上是您声明的类,而不是类的实例。你需要说
T = d.Globals()
而不是
T = d.Globals