如何将NumPy数组元素转换为C++ typedef类型?SWIG适配问题
解决SWIG传递NumPy数组元素到MY_INT类型的问题
环境
- Ubuntu 18.04
- SWIG 4.2.0
问题复现文件
Var.hpp
typedef int MY_INT; void printMyInt(MY_INT num) { printf("MY_INT value: %d\n", num); }
原问题接口文件 var.i
%module var %{ #include "Var.hpp" %} %include "Var.hpp"
测试脚本 test_var.py
import numpy as np import var # 正常执行 var.printMyInt(10) var.printMyInt([20][0]) # 报错:TypeError: in method 'printMyInt', argument 1 of type 'MY_INT' arr = np.array([30], dtype=np.int32) var.printMyInt(arr[0])
最小解决方法
1. 修改接口文件 var.i
仅添加必要的NumPy类型映射配置,无需额外依赖文件:
%module var %{ #include "Var.hpp" %} # 引入NumPy核心SWIG接口 %include "numpy.i" # 为MY_INT生成适配NumPy标量的类型映射 %numpy_typemaps(MY_INT, NPY_INT); %apply MY_INT { MY_INT }; %include "Var.hpp"
2. 编译命令
确保已安装依赖包python3-dev和python3-numpy,执行以下命令:
# 生成SWIG包装代码 swig -python -c++ var.i # 编译包装代码为目标文件 g++ -fPIC -c var_wrap.cxx -I/usr/include/python3.6m -I/usr/lib/python3/dist-packages/numpy/core/include # 编译为共享库 g++ -shared var_wrap.o -o _var.so
(注:Python头文件路径需根据系统实际Python版本调整,Ubuntu 18.04默认Python3.6)
3. 验证测试脚本
重新运行test_var.py,所有调用均正常执行,输出如下:
MY_INT value: 10 MY_INT value: 20 MY_INT value: 30
关键说明
- 无需引入
pyfragments.swg,仅numpy.i即可处理NumPy标量到C++类型的转换 %numpy_typemaps(MY_INT, NPY_INT)是核心,它为MY_INT类型生成适配NumPy int标量的转换逻辑%apply MY_INT { MY_INT };确保SWIG将该映射应用到所有接收MY_INT类型参数的函数上
内容的提问来源于stack exchange,提问作者McClain
相关产品推荐
相关产品推荐

