Доброго времени суток
Есть сторонняя сишная библиотека, которую кровь из носу нужно использовать из python
К сожалению, сразу уровень «хардкор»:
- функции получения информации хотят на входе указатель на структуру. Т.е. выделить память нужного размера требуется до вызова
- поля структуры разные и интересные, включая unsigned long long
есть полный магии swig, который может автоматом сгенерить wrapper и модуль. с некоторыми недостатками
- поля типа unsigned long long возвращает в питон в виде
<Swig Object of type 'u_longlong_t *' at 0xa00000000127990>
, который ни во что не удаётся перевести (int(result.field)
,ctypes.c_ulonglong(result.field)
при нескольких вызовах подряд дают разный результат ). Ок, правлю созданный сишный wrapper, чтобы он правильно приводил тип и возвращалresultobj = SWIG_From_int((unsigned long long)(result))
; - функции swig обернул как есть, т.е. в
function1(pointer,size)
всё ещё нужно указывать размер области памяти. причём размер сишной структуры я из python не знаю как получить. ок, правлю созданный wrapper, чтобы он самостоятельно подставлял правильный size, игнорируя переданный параметр
этим в принципе можно пользоваться после ручных правок
Но чисто для общего развития, а можно ли вручную создать такой extension без использования swig? Т.е. чтобы на стороне питона операции шли исключительно с объектами? Когда память под структуру инициализируется в конструкторе питоньего объекта, а фукнции можно передать объект, и она корректно возьмёт из его внутренностей структуру?
чтение официальной доки идёт через кровь и слёзы (дано забыл си), но пока я в упор не вижу там похожих примеров, всё на уровне helloworld