2011-12-25 3 views
4

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

Я имею эту структуру:

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 или что-то в этом роде.

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

+0

http://cython.org/ –

+0

Как я могу использовать Cython для передачи структуры? Я просматриваю документацию и не могу найти ничего, что является рабочим примером того, что я ищу. Спасибо за ваше время. – blakeman8192

ответ

0

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

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

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

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

+0

Да, это на самом деле хорошая идея, я думаю - имея функции get/set в C с некоторым API, а затем используя их с Python. Вид неуклюжий, но это единственный способ. Отметьте это как мой принятый ответ, пока кто-то не найдет волшебное решение. – blakeman8192

0

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

+0

Спасибо за ввод. Я заглянул в него (здесь: http://www.swig.org/Doc1.3/Python.html#Python_nn19), но похоже, что у меня будут проблемы с указателями, и это просто не сработает. Я обсуждаю, должен ли я писать игровой сервер в Java и использовать Jython, который потребует гораздо меньше «кода клей», но я действительно ищу производительность и легкий характер не абстрактного C. – blakeman8192

2

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

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

0

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