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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 20:35:04