使用ctypes将Python数组传递给C++函数

1 投票
1 回答
2342 浏览
提问于 2025-04-17 16:28

我对这种扩展方式还很陌生(虽然我在C++和Python方面有不错的基础)

我想用ctypes模块把数据传递给一个C++函数

这是我目前成功的一个例子:

test.dll文件

#define DLLEXPORT extern "C" __declspec(dllexport)

DLLEXPORT int sum(int a, int b) {
    return a + b;
}

sum_test.py文件:

from ctypes import cdll
mydll = cdll.LoadLibrary('test.dll')
mydll.sum(5, 3)

结果是8,运行得很好……

注意: 我正在用这个开发一个Blender的插件,我要传递给C++函数的数据是一个很大的数组(元组或者其他类型的数组),这些数据会传递给GPU,用OpenCL来处理

在C++中的主要工作流程是传递一个指针(这样可以把整个数组的数据复制到GPU上)

所以问题是: 在C++中获取这个元组指针的最佳方法是什么(希望能解释一下在Python和C++中发生了什么)

1 个回答

3

最简单的方法就是告诉ctypes这个函数需要一个指向某种类型数组的指针。在很多情况下,Python和ctypes会自动处理其他的事情。

libc = CDLL('libc.so.6') # on Debian/Linux
printf = libc.printf
printf.restype = c_int
printf.argtypes = [POINTER(c_char), c_int]
printf('< %08x >', 1234)

这假设这个函数只需要一个指针。如果你的函数需要正好五个浮点数,你可以提供c_float * 5作为对应的参数类型。

撰写回答