使用 SWIG 将 C++ 数组转换为 Python 列表

问题描述 投票:0回答:1

我想在 C++ 中有一个返回 uint8_t 数组的方法,然后使用 SWIG 使该函数在 python 中作为列表可用,如下所示:

class MyClass
{
uint8_t array_return() {
uint8_t random_array[100];
return random_array;
}
};

然后在Python中:

object = MyClass
my_list = object.array_return()

我对 SWIG 还很陌生,对 C++ 也不是很精通,而且堆栈溢出的其他问题似乎不起作用。

如何使用 SWIG 将 C++ 数组转换为 Python 列表? 这个答案似乎不起作用(使用 std::vector)

还尝试直接在.i文件中映射:

%typemap(out) uint8_t *array_return %{
  $result = PyList_New(100);
  for (int i = 0; i < 100; ++i) {
    PyList_SetItem($result, i, PyFloat_FromDouble($1[i]));
  }
%}

最后我总是会得到一个 SwigPyObject 并且它不可下标/可迭代

python c++ pointers swig
1个回答
0
投票

std::vector
有一个官方的 SWIG 示例: https://github.com/swig/swig/tree/master/Examples/python/std_vector

生成的对象的行为与内置 Python 列表相同。

当谈到您的示例时,存在大量问题,但没有一个与类型映射本身相关,这是完全正确的。

这是正确的工作版本:

%module myarray

%typemap(out) uint8_t *array_return %{
  $result = PyList_New(100);
  for (int i = 0; i < 100; ++i) {
    PyList_SetItem($result, i, PyLong_FromLong($1[i]));
  }
%}

%inline %{
class MyClass
{
  uint8_t random_array[100];
public:
  uint8_t *array_return() {
    return random_array;
  }
};
%}

Python测试:

import myarray
o = myarray.MyClass()
print(o.array_return())
© www.soinside.com 2019 - 2024. All rights reserved.