Как преобразовать массив C в Python кортеж или список с помощью SWIG?
Я разрабатываю проект библиотеки C++/Python, который использует SWIG при преобразовании кода C++ в библиотеку Python. В одном из заголовков C++ у меня есть некоторые глобальные постоянные значения, как показано ниже.
const int V0 = 0;
const int V1 = 1;
const int V2 = 2;
const int V3 = 3;
const int V[4] = {V0, V1, V2, V3};
Я могу использовать V0 для V3 непосредственно из Python, но не могу получить доступ к записям в V
.
>>> import mylibrary
>>> mylibrary.V0
0
>>> mylibrary.V[0]
<Swig Object of type 'int *' at 0x109c8ab70>
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'SwigPyObject' object has no attribute '__getitem__'
Может ли кто-нибудь сказать мне, как автоматически преобразовать V
в кортеж или список Python? Что мне делать в моем файле .i
?2 ответа:
Следующий макрос действительно работал.
%{ #include "myheader.h" %} %define ARRAY_TO_LIST(type, name) %typemap(varout) type name[ANY] { $result = PyList_New($1_dim0); for(int i = 0; i < $1_dim0; i++) { PyList_SetItem($result, i, PyInt_FromLong($1[i])); } // i } %enddef ARRAY_TO_LIST(int, V) %include "myheader.h"
Если вы не хотите создавать типовую карту, вы можете использовать библиотеку swig carrays.i для доступа к записям в массиве типа C.
Ваш .I файл будет выглядеть примерно так:
%{ #include "myheader.h" %} %include "carrays.i" %array_functions(int,intArray) %include "myheader.h"
И тогда вы могли бы получить доступ к mylibrary.V[0] в python с:
>>> intArray_getitem(mylibrary.V, 0)