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

SWIG如何包装int64_t引用参数的函数?Python调用类型错误如何解决

问题根因

SWIG按从上到下的顺序解析接口文件,你将%apply类型映射指令放在了%inline代码块之后,处理read、set_value函数定义的时候,INOUT类型映射还未生效,所以没有对引用参数做特殊处理,依旧要求传入C++引用类型的对象,而不是直接接收Python的数值类型。

修复方案

1. 调整接口文件顺序

将%apply指令移动到对应函数定义的前面,修改后的TestRef.i内容如下:

%module test_ref
%{
#include <iostream>
%}

%include <stdint.i>
%include <typemaps.i>

// 先应用INOUT类型映射,再声明/定义用到对应参数的函数
%apply int64_t& INOUT { int64_t& idx };
%apply double& INOUT { double& a };

%inline %{
struct Result {
    uint64_t len;
    void* data;
};

Result read(int64_t& idx) {
    std::cout << idx << std::endl; // just to use idx
    idx++;
    return Result{1, nullptr};
}

void set_value(double& a) {
  a = 42.;
}
%}
// 无需重复声明set_value,%inline中的定义已经被SWIG解析

2. 重新执行构建命令

$ swig -python -c++ -I/usr/include TestRef.i 
$ g++ -fPIC -c TestRef_wrap.cxx -I/opt/rh/rh-python38/root/usr/include/python3.8 -std=c++17 -O3
$ g++ -shared TestRef_wrap.o -o _test_ref.so -lrt

3. Python端正确调用

INOUT引用参数会作为返回值的一部分,和原函数返回值一起组成元组返回,调用方式如下:

import test_ref

# 测试read函数
idx = 1000
p, new_idx = test_ref.read(idx)
print(new_idx) # 输出1001

# 测试set_value函数
a = 0.0
new_a = test_ref.set_value(a)
print(new_a) # 输出42.0

内容的提问来源于stack exchange,提问作者HCSF

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:36:03