gpt4 book ai didi

python - 在无法访问库源的情况下将 swig c++ 用于 python

转载 作者:行者123 更新时间:2023-11-30 04:52:43 25 4
gpt4 key购买 nike

我是 swig 的新手,并尝试在文档中搜索答案,但我要么没有找到答案,要么在看到答案时没有认出答案。

我有一个来自第三方的大型 C++ 库,除了 header 之外我没有任何源代码。我需要从 python 访问一些 API,其中一些 API 的函数原型(prototype)类似于:

int foo(int& a, int& b, int& c);

我创建了一个 .i 文件,如下所示:

%module myWrapper 
%{
#include libraryHeader.h
%}
extern int foo(int& m1, int& m2, int& bf);

这通过 swig、g++ 编译器和链接器没有问题。我可以将模块导入 python,但是当我调用它时出现以下错误:

TypeError: 在方法 'foo' 中,参数 1 类型为 'int &'

我已经声明了 3 个 int 变量,比如 m1 = 0; m2 = 0; bf = 0 所以我正在传递 something 。有没有办法使用 typemaps.i 库或显式使用类型映射来做到这一点?文档在这个问题上似乎有点含糊。

提前致谢,保罗

最佳答案

SWIG 需要提示参数不仅仅是输入。这些提示由类型映射提供。您需要定义类型图或使用预定义的类型图(请参阅 typemaps.i )。

这是一个例子:

%module test

%{
int foo(int& a, int& b, int& c)
{
int ret = a + b + c;
a = 10;
b = 20;
c = 30;
return ret;
}
%}

%include <typemaps.i>
int foo(int& INOUT, int& INOUT, int& INOUT);

使用 INOUT 类型映射,Python 可以将整数传递给使用 for int*int& 的函数,返回值将是原始返回值和任何输出参数的元组。编译上面的 SWIG 结果并在 Python 中使用如下所示:

>>> import test
>>> test.foo(1,2,3)
[6, 10, 20, 30]

您可以使用如下代码更新变量:

>>> a,b,c = 1,2,3
>>> r,a,b,c = test.foo(a,b,c)
>>> r
6
>>> a,b,c
(10, 20, 30)

请注意,您还可以%apply 现有类型映射到类型,因此如果使用%include "libraryHeader.h" 而不是直接声明函数,您可以使用以下一般应用INOUT 类型映射到所有 int& 参数:

%apply int &INOUT { int& };
%include "libraryHeader.h"

关于python - 在无法访问库源的情况下将 swig c++ 用于 python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54187844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com