Я пытаюсь написать обертку библиотеки .so для существующего проекта исходного кода C, а затем вызывать функции в .so-библиотеке из Python. Мне удалось вызвать функции с примитивными аргументами и возвращать типы без проблем, поэтому теперь я работаю над взаимодействием с более сложными функциями, у которых есть аргументы, являющиеся указателями на структуры.Извлечение структур из .so-файлов в Python
Моя проблема заключается в создании структур на стороне Python, чтобы я мог вызвать функции C-библиотеки. Некоторые из структур в .so-библиотеке имеют сотни полей, поэтому я надеялся, что существует более простая альтернатива описанию всех полей и типов в объектах Python ctypes Structure
.
Я хотел бы быть в состоянии написать что-то вроде этого является Python:
from ctypes import *
lib = cdll.LoadLibrary("./libexample.so")
class Input(Structure):
_fields_ = lib.example_struct._fields ## where `example_struct` is defined in the .so library
## I have no idea if you can actually get the fields of the struct!!
my_input = Input(a,b,c,...) ## pseudo-code
my_ptr = pointer(my_input) ## wrap the input with a pointer
result = lib.my_lib_func(my_ptr) ## call .so function with struct
Это позволит мне легко воспроизвести, по крайней мере определение структуры крупных структур C, без необходимости создавать и поддерживать длительный Python версии структурных определений. Это возможно? Или есть другой способ добиться такого же эффекта?
EDIT: исходный код C является третьим лицом, поэтому на данный момент я ищу подход, в котором мне не нужно изменять источник C.
* "structs [...] имеют сотни полей" * Это обычно указывает на недостаток дизайна. Возможно, более целесообразно использовать массивы. – user3386109
Может быть, но это не мой код, поэтому я пытаюсь обернуть его неинвазивным способом, если это возможно. – gariepy
@ user3386109: Есть очень хорошо такие 'structs'. Но они редки и для нового кода, некоторый подход ООП с наследованием часто лучше. – Olaf