我有一个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模块中调用它。我想我必须编写另一个C ++函数,例如,返回std :: pair。但是如果可能的话,我想知道Python方面的解决方法。有人可以帮忙吗?
答案 0 :(得分:8)
对于很多情况(例如int *n
),写下来就足够了:
%apply int *OUTPUT { int *n };
使用SWIG为输出参数提供的一些默认类型映射。 (还有INOUT和INPUT类似)。
在这种情况下,虽然我们不完全匹配任何预定义的情况,但我们需要手动执行相同的操作。这基本上是每个参数的两个类型映射 - 一个输入类型映射,它为实际的函数调用创建临时的东西,并使用它而不是一些真正的输入和一个argout,它将结果从临时编组回Python。在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 typemap需要动态分配内存,那么freearg typemap通常很有用。
这足以让我编译并运行它:
import test
len,str = test.foo()
print len
print str