Доступ к пустым указателям в Python (используя SWIG или что-то еще) - PullRequest
1 голос
/ 27 февраля 2010

Я пытался использовать SWIG, чтобы обернуть простую библиотеку, которая использует ioctl () для заполнения структуры, подобной следующей:

struct data
{
  header* hdr;
  void* data;
  size_t len;
};

data - указатель на буфер, len - длина этого буфера.

Я не могу понять, как преобразовать data в строку (или массив) Python. Кроме того, мне нужен способ освободить этот буфер в деструкторе. Любые предложения приветствуются.

Ответы [ 2 ]

2 голосов
/ 17 мая 2012

swig предоставляет модуль с именем «cdata.i». Вы должны включить это в файл определения интерфейса.

Как только вы включите это, он даст две функции cdata () и memmove (). Учитывая пустоту * и длину двоичных данных, cdata () преобразует их в строковый тип целевого языка. memmove () наоборот. учитывая тип строки, он скопирует содержимое строки (включая встроенные нулевые байты) в тип C void *.

Обработка двоичных данных становится намного проще с этим модулем. Я надеюсь, что это то, что вам нужно.

1 голос
/ 27 февраля 2010

Поскольку вы говорите «или что-то еще» в заголовке Q - если вы решите использовать ctypes , вы можете представить void* с c_void_p (один из основных типов ctypes * )типы данных и функции доступа, такие как free и memcpy, из библиотеки времени выполнения C (при условии, что последняя доступна в виде динамической библиотеки DLL / .so, но в наши дни это довольно широко распространено).изменяемый буфер символов, в который вы можете memcpy данные, используйте create_string_buffer .

Конечно, вы можете альтернативно использовать Python C API - PyByteArray_FromStringAndSize в этом случае вы будете использовать для копирования байтового массива ваши void* и длину (и, конечно, вы будете вызывать free напрямую, когда это уместно, так как в любом случае это просто C-код).

Другой возможностью для рассмотрения является Cython , Python-подобный язык, разработанный для написания расширений Python и такой, что компилятор Cython может генерировать компилируемый код C из исходников Cython - в Cython, your struct будет выглядеть следующим образом:

cdef struct data:
    void* hdr
    void* data
    unsigned int* len

при условии, что вы не хотите объявлять header (т. е. для вас здесь важны только data и len) -- size_t, я полагаю, в настоящее время не является частью Cython (я могу ошибаться, они продолжают добавлять вещи ;-), но unsigned int, вероятно, могут это сделать.

Извините, это было слишкомдавно я использовал SWIG всерьез (что со всеми этими отличными альтернативами) - я бы пропустил вопрос Q, если бы не заголовок "или что-то еще" в заголовке; -).

...