python - 通过 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代码。通过ctypes
as加载库后lib
,我有:
def q():
lib.returnQ.restype = ndpointer(dtype=ctypes.c_double, shape=(4,))
return lib.returnQ()
但是,当我调用q()
Python 时,我得到一个随机数数组。我不确定为什么?
解决方案
如评论中所述,您的向量是一个局部变量,并在从函数返回后被销毁。一种可行的方法是让 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]
推荐阅读
- azure - 带有 URL 的 Azure Neo4j v4 LOAD CSV 无法识别文件
- botframework - 如何将密码活动表单bot传递到microsoft bot框架中的前端
- php - 获取 laravel post api 来识别 json 数据
- collision-detection - 碰撞检查 GMS2
- c - C 程序:修改机场模拟以拥有两条跑道
- c++ - Eclipse C/C++ (CDT) 将标头包含到项目中 - 未定义的参考
- conemu - ConEmu:如何从 conemu 打开标准 windows cmd.exe 窗口(并执行命令 - 例如启动批处理文件)
- java - 使用用户输入绘制菱形(不是用户输入的两倍)
- javascript - 为什么切换类在我的 html 页面中不起作用
- discord - 删除 Discord 上某人的所有消息