如何在 Python + SWIG 中接收引用和指针参数?
Posted
技术标签:
【中文标题】如何在 Python + SWIG 中接收引用和指针参数?【英文标题】:How to receive reference and pointer arguments in Python + SWIG? 【发布时间】:2013-03-03 11:06:44 【问题描述】:我有一个 C++ 函数,其中给出了两个参数,如下例所示。
void func(int& n, char** data)
*data = other_func1(); // returns a char array
n = other_func2(); // returns the length of the array
我可以在 C 或 C++ 中轻松使用此函数,但我不知道如何从 SWIG 生成的 Python 模块中调用它。我想我将不得不编写另一个返回例如 std::pair 的 C++ 函数。但如果可能的话,我想知道 Python 方面的解决方法。有人可以帮忙吗?
【问题讨论】:
【参考方案1】:在很多情况下(例如int *n
),这样写就足够了:
%apply int *OUTPUT int *n ;
它使用 SWIG 为输出参数提供的一些默认类型映射。 (也有类似的INOUT和INPUT)。
在这种情况下,虽然我们不完全匹配任何预定义的情况,所以我们需要手动执行相同的操作。这基本上是每个参数两个类型映射 - 一个输入类型映射,它为实际函数调用创建一些临时的东西,并使用它而不是一些真正的输入,以及一个将结果从临时返回到 Python 的 argout。在 Python 的情况下,使用元组返回多个参数是有意义的。
一个例子:
%module test
%typemap(in,numinputs=0) int& n (int temp) "$1 = &temp;"
%typemap(in,numinputs=0) char **data (char *temp) "$1 = &temp;"
%typemap(argout) char **data
%append_output(PyString_FromString(*$1));
%typemap(argout) int& n
%append_output(PyInt_FromLong(*$1));
%inline %
void foo(int& n, char **data)
static char str[] = "Hello world";
*data = str;
n = sizeof str;
%
注意事项:
临时变量(int temp
、char *temp
)会自动重命名,从而停止明显的名称冲突。 %append_output
是一个 SWIG 宏,它扩展为在 Python 中的 $result
元组后面添加一些内容。如果你的函数foo
是动态分配的内存,你需要处理它。如果 in 类型映射需要动态分配内存,则 freearg 类型映射通常很有用。
这足以让我像这样编译和运行它:
import test
len,str = test.foo()
print len
print str
【讨论】:
以上是关于如何在 Python + SWIG 中接收引用和指针参数?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 swig 修改类构造函数以保持对构造函数参数之一的引用?
swig 生成的python接口,在python中怎么传入void*入参?