Передача структуры C в функцию Python - PullRequest
4 голосов
/ 26 декабря 2011

Мне нужен простой способ передать структуру C в функцию Python. Я встроил Python в игровой сервер и намереваюсь написать игровую логику на Python. Я просмотрел Google и списки рассылки и не нашел ничего полезного. У меня есть сложная структура в C (с указателями на другие относительно сложные структуры), и я не нашел разумного способа сделать это.

У меня есть такая структура:

struct client {
    int state;
    int sockfd;
    struct sockaddr_in *addr;
    struct epoll_event *epollev;
    struct buffer *in_buffer;
    struct buffer *out_buffer;
    struct packet *packet;
    struct player *player;
};

И нужно передать его в функцию Python, где я могу легко получить доступ к членам с общим синтаксисом (желательно не использовать такие вещи, как dicts, хотя это тоже нормально). Это почти как будто мне нужна функция PyObject_FromStruct или что-то в этом роде.

Есть ли относительно простой способ сделать это?

Ответы [ 4 ]

2 голосов
/ 26 декабря 2011

SWIG может делать указатели, особенно если вы можете рассматривать их как непрозрачные BLOB-объекты в вашем коде Python.

Вы также можете получить что-нибудь с Cython - это диалект Python, который позволяет смешивать типы данных Python и C.

0 голосов
/ 27 декабря 2011

Я бы обернул структуру во что-нибудь усваиваемое python с помощью boost :: python.А затем получите доступ к функциям, которые вы хотите экспортировать в python.

0 голосов
/ 27 декабря 2011

Я думаю, что наиболее простым способом может быть написание функций get () / set () для каждого элемента в структуре (например, get_addr (), который получает значение адреса), а затем:

Вариант 1 (я думаю, что это самый простой вариант): скомпилируйте ваш код на c как файл dll с экспортированным get / set и загрузите его в python для вызова функций get (проверьте мой пост здесь для использования dll в python, и это Q & A может быть полезно для использования .so файлов в linux

Вариант 2: вы можете использовать SWIG, чтобы получить файл pyd и импортировать его в python для вызова функций "get / set"

используя этот способ, python работает только с указателями NOT и не использует адреса памяти.

0 голосов
/ 26 декабря 2011

Лучшей ставкой будет что-то вроде swig , но я думаю, что указатели создадут вам проблемы.

...