首页 > 解决方案 > 通过 Ctypes 将 std:vector 从 C++ 传递到 Python:获取无意义的值

问题描述

我试图按照这里的程序进行操作,但我被卡住了。我正在尝试将std:vector我的 C++ 代码(包含在 中extern C)传递给 Python。这就是我所拥有的:

extern 'C' {
    double* returnQ() {
        std::vector<double> v = {7.5, 5.5, 16.5, 8.5};
        std::cout<<"Print first element:"<<vec[0]<<std::endl;
        return v.data(); }
}

这是我的python代码。通过ctypesas加载库后lib,我有:

def q():
    lib.returnQ.restype = ndpointer(dtype=ctypes.c_double, shape=(4,))
    return lib.returnQ()

但是,当我调用q()Python 时,我得到一个随机数数组。我不确定为什么?

标签: pythonc++ctypes

解决方案


如评论中所述,您的向量是一个局部变量,并在从函数返回后被销毁。一种可行的方法是让 Python 管理内存并将数据复制到其中。

测试.cpp

#include <vector>
#include <cstring>

#define API __declspec(dllexport) // Windows-specific export

// Must pass double[4] array...
extern "C" API void returnQ(double* data) {
    std::vector<double> v = {7.5, 5.5, 16.5, 8.5};
    // Of course, you could write directly to "data" without the vector...
    std::memcpy(data,v.data(),v.size() * sizeof v[0]);
}

用法:

>>> from ctypes import *
>>> dll = CDLL('test')
>>> dll.returnQ.argtypes = POINTER(c_double),
>>> dll.returnQ.restype = None
>>> data = (c_double * 4)()  # equivalent to C++ double[4]
>>> dll.returnQ(data)
>>> list(data)
[7.5, 5.5, 16.5, 8.5]

推荐阅读