如何正确访问struct值并将它们传递给functions- boost :: python

时间:2017-03-23 14:52:50

标签: python c++ struct boost-python

我正在努力使用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

1 个答案:

答案 0 :(得分:1)

问题在于T实际上是您声明的类,而不是类的实例。你需要说

T = d.Globals()

而不是

T = d.Globals