You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:03:40