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

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

参考方案

在很多情况下(例如int *n),编写以下内容就足够了:

%apply int *OUTPUT { int *n };

它使用SWIG为输出参数提供的一些默认类型映射。 (还有INOUT和INPUT相似)。

在这种情况下,尽管我们没有完全匹配任何预定义的情况,所以我们需要手动执行相同的操作。基本上每个参数有两个typemap-一个输入typemap,它为实际的函数调用创建一些临时内容,并使用它代替某些实际输入,并且使用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 tempchar *temp)将自动重命名,从而停止明显的名称冲突。 %append_output是一个SWIG宏,它可以扩展为在Python中的$result元组的后面添加一些内容。如果您的函数foo是动态分配的内存,则需要进行处理。如果in类型映射需要动态分配内存,则freearg类型映射通常很有用。

这足以让我像这样编译和运行它:

import test

len,str = test.foo()

print len
print str

在Java中,执行“ ++++++++”表达式,编译器未报告任何错误并且可以正确执行? - java

我用eclipse编写了这段代码,用war写过,结果为3d。public static void main(String[] args) { double a = 5d + + + + + +-+3d; System.out.println(a); } 参考方案 您的表情可以改写为(5d) + (+ + + + +-+3d) 其中第一个+是应用于两个操作数的…

在Python和C++之间传输数据而无需写入Windows和Unix文件 - python

我有预先存在的python和C ++文件,其中python文件定义了许多点,而C ++代码利用其现有库进行了所需的计算。最终产品是C ++代码写入的文件。我正在寻找一种在python中获取2000点列表的方法,将其传递给函数,然后执行所有C ++代码并输出我需要的文件。其他注意事项。这必须是可以在Linux或Windows机器上工作的东西,并且最少安装新插件…

扩展Python时可以使用C++功能吗? - c++

Python手册说您可以在C和C++中为Python创建模块。使用C++时可以利用类和模板之类的东西吗?它不会与其他库和解释器产生不兼容吗? 参考方案 挂钩函数的实现是用C还是用C++实现都没有关系。实际上,我已经看过一些Python扩展,这些扩展有效利用C++模板甚至Boost库。没问题。 :-)

将Python嵌入C++应用程序 - c++

上下文:我们一直面临的一个持续问题是对我们的市场数据应用程序进行单元测试。这些应用程序坐下来观察从提要中检索到的数据并执行某些操作。一些很难触发的关键事件很少发生,并且测试人员很难在所有情况下验证我们的应用程序是否正常运行,因此我们必须依靠单元测试。这些系统通常通过在事件发生时发出回调(进入我们的应用程序)来工作,然后由我们负责处理此事件。 我设想的解决方案…

Python的C++名称处理库 - c++

Improve this question 我想在Python程序中修改和分解C++函数名。有没有类似的东西可用?我搜索了几个小时,也许我很幸运在这里... 参考方案 您很可能不想在Python中执行此操作。顺便说一句,您可能不应该从DLL中导出错误的名称,因为这样会使具有不同编译器的人难以使用。如果必须使用变形的名称,则只需在Python代码中对其进行硬编…