Boost:python将指针指向指针作为参数传递

boost:python passing an pointer to pointer as parameter

本文关键字:指针 参数传递 python Boost      更新时间:2023-10-16

首先,我不是python程序员,所以请原谅我的愚蠢错误。

在c++中,我从MyClass中获得了这个公共方法,它可以动态地创建一个图像并返回它的大小。

int MyClass::getImg(uchar *uimg[])
{
    int size = variable_size;
    *_uimg = new uchar[size];
    memcpy(*_uimg, imageOrigin->data(), size);
    uimg = _uimg;
    return size;
}

和boost:python:

BOOST_PYTHON_MODULE(mymodule)
{
    class_<MyClass>("MyClass")
        .def("getImg", &MyClass::getImg)
    ;
}

,当我尝试在python中使用它时:

def getImg():
    img = c_char_p()
    size = mymodule.MyClass.getImg(byref(img))

我得到这个错误:

Boost.Python.ArgumentError: Python argument types in
    MyClass.getImg(MyClass, CArgObject, CArgObject)
did not match C++ signature:
    getImg(class MyClass {lvalue}, unsigned char * *)

在python中我也尝试过声明

img = POINTER(c_ubyte)()

但这也没有帮助。

我在谷歌上搜索了几个小时,但没有找到任何好的解决方案。

我只需要在python中访问那个图像,我怎么才能做到这一点?

修改后的工作版本,将数据公开为python列表。

我不确定如何实现这个,但是如果你可以自由选择你的python接口,可能会有更好的实现方式。我认为创建一个列表可能是一个更好的暴露它的方式。您期望从返回值中得到什么?也许你也可以把它包装成一个numpy数组以获得更好的性能(如果你搜索boost python和numphy,也有一些关于stackoverflow的问题)

class TestPtr
{
public:
  int getImg(uchar **uimg)
  {
     int size = 9045;
     uchar *_uimg = new uchar[size];
     for( int i = 0; i < size; ++i )
       _uimg[i] = i;  
    *uimg = _uimg;
     return size;
 }
};
boost::python::list getImgList( TestPtr &p )
{
  uchar *uimg;
  int rv = p.getImg(&uimg);
  boost::python::list l;
  for ( int i = 0; i < rv; ++i)
    l.append( uimg[i] );
  return l;
}
BOOST_PYTHON_MODULE(mymodule)
{
  class_<TestPtr>("TestPtr")
    .def("getImg",&getImgList)
    ;
}

另一个提示,在您的问题中,您使用了以下行来调用该方法:

 mymodule.MyClass.getImg()

这将对您的对象进行类调用(或多或少相当于静态调用)。这是一种更正确的方法:

img = mymodule.MyClass()
data = img.getImg()