使用ctypes与numpy为接收int数组的C++函数编写Python包装器
这里是整理好的、用于用ctypes和Numpy给接收int数组的C++函数编写Python包装器的最简示例代码,同时补充了实际开发中需要注意的关键细节:
C++ 源文件(copy.cpp)
#include <vector> extern "C" std::vector<int>* copy_vec(int* array, int size){ std::vector<int>* vec = new std::vector<int>(size); for (int i=0; i<size; i++){ vec->push_back(array[i]); } return vec; }
注意:
extern "C"是必须的——它能避免C++的名称修饰问题,让ctypes可以正确定位到函数符号;另外代码中返回了动态分配的std::vector指针,后续一定要记得释放内存,避免泄漏。
Python 包装代码(copy.py)
import ctypes as ct import numpy as np INT_POINTER = ct.POINTER(ct.c_int) # 根据系统补全动态库后缀:Linux是.so,Windows是.dll,macOS是.dylib _lib = ct.cdll.LoadLibrary('./libcopy.so') # 必须指定函数的参数类型和返回类型,避免类型错误和未定义行为 _lib.copy_vec.argtypes = [INT_POINTER, ct.c_int] # std::vector的指针无法直接映射到ctypes原生类型,先用void*接收 _lib.copy_vec.restype = ct.c_void_p
额外实用提示
- 编译C动态库的命令(以g为例):
g++ -shared -fPIC copy.cpp -o libcopy.so - 从Python传递Numpy数组到C++:可以用
np.array([1,2,3], dtype=np.int32).ctypes.data_as(INT_POINTER)来获取兼容的指针 - 解决内存泄漏:建议在C++中补充一个释放vector的函数,再在Python中绑定调用:
// 加到copy.cpp中 extern "C" void free_vec(std::vector<int>* vec){ delete vec; }// 加到copy.py中 _lib.free_vec.argtypes = [ct.c_void_p] _lib.free_vec.restype = None
内容的提问来源于stack exchange,提问作者Guilherme de Lazari
相关产品推荐
相关产品推荐

