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
相关产品推荐
相关产品推荐

