用SWIG在c++ Python包装类中填充二进制数据的char*



我用swig包装了一个c++类以供python使用。我的类是:

public class DataHolder
{
public:
     char* BinaryData;
     long Length;
}
public class MyProcessor
{
public:
    int process(DataHolder& holder)
    {
          holder.BinaryData = assign some binary data;
          holder.Length = 1024;
    }
}

我想从python得到的是这样的东西:

import Module
from Module import *
proc = MyProcessor();
holder = DataHolder();
proc.process(holder);
#use holder.BinaryData to, for example, print

任何帮助将非常感激,非常感谢!

您的示例c++代码不是很合法(它看起来更像Java!),但是一旦我修复了这个问题并添加了一些真正的process做的事情,我就能够像您希望的那样包装它。

与我之前的回答相比,主要的变化是从类内部读取长度,而不是在容器上调用方法的结果。这有点难看,因为我必须硬编码c++ ' This '对象的名称,$self引用Python对象。因此,我让typemap只在我们确定它是合法和正确的有限情况下应用。

所以我最终的界面文件看起来像这样:

%module test
%typemap(out) char *DataHolder::BinaryData {
  Py_buffer *buf=(Py_buffer*)malloc(sizeof *buf);
  if (PyBuffer_FillInfo(buf, NULL, $1, arg1->Length, true, PyBUF_ND)) {
    // Error, handle
  }
  $result = PyMemoryView_FromBuffer(buf);
}
%inline %{
class DataHolder
{
public:
     char* BinaryData;
     long Length;
};
class MyProcessor
{
public:
    int process(DataHolder& holder)
    {
          static char val[] = "HelloBinaryWorldn!";
          holder.BinaryData = val;
          holder.Length = sizeof val;
          return 0;
    }
};
%}

我测试了:

from test import *
proc = MyProcessor()
holder = DataHolder()
proc.process(holder)
data = holder.BinaryData
print(repr(data))
print(data.tobytes())

我这里的目标是Python3,但完全相同的代码应该适用于Python 2.7。当编译和运行时给出:

swig2.0 -c++ -Wall -py3 -python test.i
g++ -Wall  -shared -o _test.so test_wrap.cxx -I/usr/include/python3.4
python3 run.py
<memory at 0xb7271f9c>
b'Hellox00Binaryx00Worldn!x00'

相关内容

  • 没有找到相关文章

最新更新