如何在Python + SWIG中接收引用和指针参数?

8

我有一个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方面的解决方法。有人能帮忙吗?

1个回答

10

对于很多情况(例如int *n),只需写:

%apply int *OUTPUT { int *n };

该代码使用SWIG提供的一些默认类型映射来处理输出参数(也有类似的INOUT和INPUT)。但是在这种情况下,我们没有完全匹配任何预定义的情况,所以我们需要手动进行相同的操作。基本上,每个参数需要两个类型映射 - 一个输入类型映射,用于为实际函数调用创建临时对象并使用它代替某些真实的输入,以及一个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 tempchar *temp)会自动重命名以避免名称冲突。 %append_output 是一个 SWIG 宏,用于将某些内容添加到 Python 中的 $result 元组的末尾。如果您的函数 foo 动态分配了内存,则需要处理它。 freearg 类型映射通常在输入类型映射需要动态分配内存时很有用。

这足以使我编译并运行它,如下所示:

import test

len,str = test.foo()

print len
print str

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接