【问题标题】:Passing reference from Python to c++ function wrapped with swig for return value将引用从 Python 传递给用 swig 包装的 c++ 函数以获取返回值
【发布时间】:2015-05-19 17:01:02
【问题描述】:

免责声明,我是一个 swig 和 python 菜鸟

我有自己的 c++ 库,我将它包装在 python 中与 swig 一起使用。

我的 c++ 类是这样的:

public MyCppClass()
{
public:
   void MyFunction(char* outCharPtr, string& outStr, int& outInt, long& outLong)
   {
         outCharPtr = new char[2];
         outCharPtr[0] = "o";
         outCharPtr[1] = "k";

         outStr = "This is a result";

         outInt = 1;

         outLong = (long)12345;
    }

}

现在我用 swig 包装这个类,并说这个模块叫做 MyClass。

我想在 python 中实现的是以下代码(或者说伪代码,因为如果它是它会工作的代码)和输出:

import module MyClass
from MyClass import MyCppClass

obj = MyCppClass();

outCharPtr = "";
outStr = "";
outInt = 0;
outLong = 0;

obj.MyFunction(outCharPtr, outStr, outInt, outLong);

print(outCharPtr);
print(outStr);
print(outInt);
print(outLong);

我想要的输出是:

>>>Ok
>>>This is a result
>>>1
>>>12345

我正在使用 python 3.4

如果这是基本的问题,我真的很抱歉,但我已经花了大约 8 个小时来解决这个问题,但还是什么都想不出来。

任何帮助将不胜感激。

谢谢。

【问题讨论】:

  • 一个问题是Python没有out参数。您已经创建了不可变的 strint Python 对象,因此所需的语法将不起作用。对象不能改变。 SWIG 可以为您做的是将 C/C++ 输出参数转换为返回值的元组。例如,outCharPtr,outStr,outInt,outLong = obj.MyFunction()
  • 非常感谢您的澄清!

标签: c++ python-3.x pass-by-reference swig


【解决方案1】:

这是一种方法。我对您的非工作示例进行了一些修改:

example.i

%module example

%include <std_string.i>
%include <cstring.i>

%cstring_bounded_output(char* outCharPtr, 256)
%apply std::string& OUTPUT {std::string& outStr};
%apply int& OUTPUT {int& outInt};
%apply long& OUTPUT {long& outLong};

%inline %{

class MyCppClass
{
public:
   void MyFunction(char* outCharPtr, std::string& outStr, int& outInt, long& outLong)
   {
         outCharPtr[0] = 'o';
         outCharPtr[1] = 'k';
         outCharPtr[2] = '\0';

         outStr = "This is a result";

         outInt = 1;

         outLong = (long)12345;
    }

};

%}

使用示例:

>>> import example
>>> c=example.MyCppClass()
>>> c.MyFunction()
['ok', 'This is a result', 1, 12345]

【讨论】:

  • 非常感谢您的回答,我实际上是这样工作的。但是还有其他方法吗?虽然它的工作百分百正确,但它看起来有点难看。
  • 这是最简单的方法。它利用预先构建的助手来配置输出参数。这些将适用于任何具有相同名称的参数的函数,或者您可以更通用并说%apply long&amp; OUTPUT {long&amp;}; 以使所有long&amp; 参数输出参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-28
  • 1970-01-01
  • 2016-09-15
  • 1970-01-01
相关资源
最近更新 更多