请问如何在 Python 中向动库的函数传参复数模板指针

2019-09-22 11:18:24 +08:00
 Huelse

代码如下:

c++ lib

//.h
static complex<double>* randomComplexArray(long n);

//.cpp
complex<double>* randomComplexArray(long n){
    complex<double>* res = new complex<double>[n];
    ...
    return res; //返回的指针
}

pybuind11

.def_static("randomCircleArray", &randomCircleArray)

python

mvec1 = randomComplexArray(1024)
foo(mvec1)
# Segmentation fault (core dumped)

如果是一般类型可以用 ctypes,但是没找到合适的解决方案,

想问下有经验的朋友知道怎么做吗?十分感谢~

3216 次点击
所在节点    C++
6 条回复
inframe
2019-09-22 13:21:09 +08:00
2 个可选策略
- 转字符串传回来,反正 py 转换很方便
- 拆成实部虚部两部分传回来,这样套路就多了,比如转换为 python 的 tuple,list 等等,反正是 py 的可以识别的对象,需要多写一个类型转换函数解包结果封装一下
Huelse
2019-09-22 13:29:04 +08:00
@inframe #1 主要是计算都是放在 c++那边的,我想就只传个指针过去给 lib 计算,python 就当个中转站
wwqgtxx
2019-09-22 13:38:46 +08:00
我的做法是用纯 c 封装个包装函数,参数传递 void*然后强制类型转换到 c++层操作
Huelse
2019-09-22 21:59:04 +08:00
@wwqgtxx #3 请问,我就想能把 c++返回到 Python 的数组指针

再从 Python 中传参到 c++函数中该怎么做呀
wwqgtxx
2019-09-22 23:53:43 +08:00
@Huelse pybind11 我不太了解,用 ctypes 的话用 c_void_p,用 cffi 的话直接 cdef 一个 void*然后把接受到指针传回给 C 函数
zhoujinjing09
2019-10-22 23:56:05 +08:00
用 py::cast 把 res 转成 py::object?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/603010

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX