Python C API Как передать массив структур из C в Python

Для модуля python, который я создаю, я хочу передать пользователю python массив таких структур:

struct tcpstat
{
    inet_prefix local;
    inet_prefix remote;
    int     lport;
    int     rport;
    int     state;
    int     rq, wq;
    int     timer;
    int     timeout;
    int     retrs;
    unsigned    ino;
    int     probes;
    unsigned    uid;
    int     refcnt;
    unsigned long long sk;
    int     rto, ato, qack, cwnd, ssthresh;
};

Я думал, что Py_BuildValues — это та функция, которую я искал. Но похоже, что это не так. Просматривая документацию Python, я нашел Buffer Protocol< /а>. Но это первый раз, когда я разрабатываю модуль Python, и официальная документация мне не очень помогла.

Является ли Buffer Protocol лучшим решением для моей проблемы? Если да, то как я могу вернуть свой массив из C в python?


person ElBaulP    schedule 03.04.2013    source источник
comment
Пробовали ли вы следующее.. stackoverflow.com/questions/4351721/ forums.indiegamer.com/   -  person Hiren Pandya    schedule 03.04.2013
comment
@HirenPandya: афаик ctypes != Python C API!   -  person Constantinius    schedule 03.04.2013


Ответы (1)


Наконец, я создал объект списка с PyListObject и добавил к этому списку словарь со значениями структуры, которую я хочу показать пользователю python.

Надеюсь, это поможет кому-то с такими же сомнениями, вот код:

PyObject *dict = NULL;
PyListObject *list;

list = (PyListObject *) Py_BuildValue("[]");

int i = 0;
for (i; i < stats_length; i++) {
    dict = Py_BuildValue("{s:i}", "LPort", stats[i].lport);
    PyList_Append(list, dict);
}

return (PyObject *) list; 
person ElBaulP    schedule 05.04.2013
comment
Было ли у вас решение отправить всю структуру, а не только конкретное поле? - person P0W; 20.03.2015
comment
Нет, нет. Но я думаю, что если вы хотите вернуть весь диктофон, возможно, return (PyObject *) dict; может сработать. Извините, но у меня нет кода, чтобы доказать это. - person ElBaulP; 20.03.2015