V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Huelse
V2EX  ›  C++

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

  •  
  •   Huelse · 2019-09-22 11:18:24 +08:00 · 3217 次点击
    这是一个创建于 1921 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码如下:

    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,但是没找到合适的解决方案,

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

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

    再从 Python 中传参到 c++函数中该怎么做呀
    wwqgtxx
        5
    wwqgtxx  
       2019-09-22 23:53:43 +08:00
    @Huelse pybind11 我不太了解,用 ctypes 的话用 c_void_p,用 cffi 的话直接 cdef 一个 void*然后把接受到指针传回给 C 函数
    zhoujinjing09
        6
    zhoujinjing09  
       2019-10-22 23:56:05 +08:00
    用 py::cast 把 res 转成 py::object?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5237 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 07:12 · PVG 15:12 · LAX 23:12 · JFK 02:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.