SWIG - Обернуть массив строк C в список Python - PullRequest
4 голосов
/ 15 апреля 2011

Мне было интересно, как правильно обернуть массив строк в C в список Python, используя SWIG.

Массив находится внутри структуры:

typedef struct {
   char** my_array;
   char* some_string; 
}Foo;

SWIG автоматически переносит some_string на строку Python.

Что я должен поместить в файл интерфейса SWIG, чтобы я мог получить доступ к my_array в Python как обычный список строк Python ['string1', 'string2']?

Я использовал typemap как sugested:

%typemap(python,out) char** {
  int len,i;
  len = 0;
  while ($1[len]) len++;
  $result = PyList_New(len);
  for (i = 0; i < len; i++) {
    PyList_SetItem($result,i,PyString_FromString($1[i]));
  }
}

Но это все равно не сработало. В Python переменная my_array отображается как SwigPyObject: _20afba0100000000_p_p_char.

Интересно, это потому, что char ** находится внутри структуры? Может мне нужно сообщить об этом SWIG?

Есть идеи?

Ответы [ 3 ]

1 голос
/ 16 апреля 2011

Я не думаю, что есть возможность автоматически обрабатывать это преобразование в SWIG.Вам нужно использовать функцию Typemap в SWIG и писать конвертер типов вручную.Здесь вы можете найти преобразование из списка Python в char ** http://www.swig.org/Doc1.3/Python.html#Python_nn59, так что половина работы выполнена.Что вам нужно сделать прямо сейчас, это проверить остальную часть документации Typemap и записать конвертер из char ** в список Python.

0 голосов
/ 22 мая 2015

Я не эксперт в этом, но я думаю:

%typemap(python,out) char** {

относится к функции, которая возвращает char **.Ваш символ ** находится внутри структуры ... посмотрите код, сгенерированный swig, чтобы подтвердить, что карта была применена или нет.

Возможно, вам придется использовать что-то вроде:

%typemap(python,out) struct Foo {

Чтобы иметь карту, которая работает со структурой Foo, которая возвращается.

Справочная информация: я использовал то же определение карты типов, что и вы, но затем для символа ** успешно.

0 голосов
/ 15 апреля 2011

Я прошу прощения за то, что немного не по теме, но если это вариант для вас, я бы настоятельно рекомендовал использовать ctypes вместо swig.Вот связанный вопрос, который я задавал ранее в контексте ctypes: Передача списка строк из python / ctypes в функцию C с ожиданием char **

...