gpt4 book ai didi

python - 使用 SWIG 在 C++ Python 包装类中用二进制数据填充 char*

转载 作者:行者123 更新时间:2023-11-30 05:43:05 26 4
gpt4 key购买 nike

我已经用 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 添加了一些真正的东西来做我就能够按照你希望的那样包装它.

与我的 previous answer 相比主要的变化是长度是从类内部读取的,而不是在容器上调用方法的结果。这有点难看,因为我不得不硬编码 C++“this”对象的名称,$self 指的是 Python 对象。因此,我使类型映射仅在我们确定其合法且正确的受限情况下应用。

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

%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[] = "Hello\0Binary\0World\n!";
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'Hello\x00Binary\x00World\n!\x00'

关于python - 使用 SWIG 在 C++ Python 包装类中用二进制数据填充 char*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30334555/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com