如何在Python中为包装的C+;传递指向数组的指针+;功能

如何在Python中为包装的C+;传递指向数组的指针+;功能,python,arrays,pointers,word-wrap,boost-python,Python,Arrays,Pointers,Word Wrap,Boost Python,我是C++/Python混合语言编程新手,对Python/CAPI不太了解。我刚开始使用Boo.python为Python包装C++库。我一直在包装一个将指向数组的指针作为参数的函数。下面是(第二cTor)的原型,在C++中。 class AAF{ AAF(AAF_TYPE t); AAF(double v0, const double * t1, const unsigned * t2, unsigned T); ~AAF(); } 在boost::python中像这样包装它,这

我是C++/Python混合语言编程新手,对Python/CAPI不太了解。我刚开始使用Boo.python为Python包装C++库。我一直在包装一个将指向数组的指针作为参数的函数。下面是(第二cTor)的原型,在C++中。
class AAF{
  AAF(AAF_TYPE t);
  AAF(double v0, const double * t1, const unsigned * t2, unsigned T);
  ~AAF();
}
在boost::python中像这样包装它,这样做对吗

class_<AAF>("AAF", init<AAF_TYPE>())
  .def(init<double, const double*, const unsigned*, unsigned>());
类(“AAF”,init()) .def(init()); 注意,它编译并链接成功,但我不知道如何在Python中调用它。我天真的尝试如下失败

>>> z = AAF(10, [4, 5.5, 10], [1, 1, 2], 3);

Traceback (most recent call last):
  File "./test_interval.py", line 40, in <module>
    z = AAF(10, [4, 5.5, 10], [1, 1, 2], 3);
Boost.Python.ArgumentError: Python argument types in
    AAF.__init__(AAF, int, list, list, int)
did not match C++ signature:
    __init__(_object*, AAF_TYPE)
    __init__(_object*, double, double const*, unsigned int const*, unsigned int)

>>> t1 = array.array('d', [4, 5.5, 10])
>>> t2 = array.array('I', [1, 1, 2])
>>> z = AAF(10, t1, t2, 3);

Traceback (most recent call last):
  File "./test_interval.py", line 40, in <module>
    z = AAF(10, t1, t2, 3);
Boost.Python.ArgumentError: Python argument types in
    AAF.__init__(AAF, int, array.array, array.array, int)
did not match C++ signature:
    __init__(_object*, AAF_TYPE)
    __init__(_object*, double, double const*, unsigned int const*, unsigned int)
z=AAF(10,[4,5.5,10],[1,1,2,3]; 回溯(最近一次呼叫最后一次): 文件“/test_interval.py”,第40行,在 z=AAF(10[4,5.5,10],[1,1,2,3]; ArgumentError:中的Python参数类型 AAF.\uuuu init\uuuf(AAF,int,list,list,int) 与C++签名不匹配: __初始化(对象*,AAF类型) __初始化(对象*,双精度,双常数*,无符号整数常数*,无符号整数) >>>t1=array.array('d',[4,5.5,10]) >>>t2=array.array('I',[1,1,2]) >>>z=AAF(10,t1,t2,3); 回溯(最近一次呼叫最后一次): 文件“/test_interval.py”,第40行,在 z=AAF(10,t1,t2,3); ArgumentError:中的Python参数类型 AAF.\uuuu init\uuuf(AAF,int,array.array,array.array,int) 与C++签名不匹配: __初始化(对象*,AAF类型) __初始化(对象*,双精度,双常数*,无符号整数常数*,无符号整数) 我的第二个问题是,我还需要包装析构函数吗?请说明这在某些情况下是否必要,但并非总是如此。

包装正确(原则上),但不正确

(正如解释器所指出的)您正在向函数传递python的列表对象,而不是指针

简而言之,如果您的函数只需要处理python的列表,那么您需要更改代码以使用该接口(而不是使用指针)。如果需要保留该接口,必须编写一个包装函数,该函数从Python中获取列表,进行适当的转换并调用原始C++函数。numpy阵列也是如此

请注意,boost::python提供了一些内置机制来将python容器转换为与stl兼容的容器

您的案例的包装代码示例如下

void f(list o) {
    std::size_t n = len(o);
    double* tmp = new double[n];
    for (int i = 0; i < n; i++) {
        tmp[i] = extract<double>(o[i]);
    }
    std::cout << std::endl;
    // use tmp
    delete tmp;
}
void f(列表o){
标准:尺寸n=len(o);
双精度*tmp=新双精度[n];
对于(int i=0;iStd::谢谢你的回复,但是正如我所说的,我对Python/C API没有太多的了解。你能指出一些地方,这样我就可以找到一种方法来把Python列表转换成C++数组吗?我会说“C数组”,但是我已经添加了一些示例代码。
void f(list o) {
    std::size_t n = len(o);
    double* tmp = new double[n];
    for (int i = 0; i < n; i++) {
        tmp[i] = extract<double>(o[i]);
    }
    std::cout << std::endl;
    // use tmp
    delete tmp;
}