gpt4 book ai didi

python - 如何在 Python 中为包装的 C++ 函数传递指向数组的指针

转载 作者:太空狗 更新时间:2023-10-30 03:08:08 25 4
gpt4 key购买 nike

我是 C++/Python 混合语言编程的新手,对 Python/C API 了解不多。我刚开始使用 Boost.Python 为 Python 包装一个 C++ 库。我坚持包装一个将指向数组的指针作为参数的函数。紧随其后的 (2nd ctor) 是它在 C++ 中的原型(prototype)。

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>());

请注意,它已成功编译和链接,但我不知道如何在 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)

我的第二个问题是我还需要包装析构函数吗?请说明这在某些情况下是否有必要,但并非总是如此。

最佳答案

包装是正确的(原则上)但在

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

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

简而言之,如果您的函数只需要处理 python 的列表,您需要更改代码以使用该接口(interface)(而不是使用指针)。如果您需要保留该接口(interface),则必须编写一个包装函数,该函数从 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;
}

请在 http://www.boost.org/doc/libs/1_39_0/libs/python/doc/tutorial/doc/html/index.html 查看 boost.python 教程.

关于python - 如何在 Python 中为包装的 C++ 函数传递指向数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/940132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com