我想在 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 并且它不可下标/可迭代
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())