algui91 algui91 -4 years ago 138
C Question

Python C API How to pass array of structs from C to Python

For a python module I'm creating, I want to pass to the python user an array of structs like this:

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;
};


I thought that
Py_BuildValues
was the function I was looking for. But seems like it isn't. Looking in the Python documentation I found the Buffer Protocol. But is the first time I'm developing a python module and the official documentation didn't help me much.

Is the Buffer Protocol the best solution for my problem? If so, How could I return my array from C to python?

Answer Source

Finnally what I did was make a list Object with PyListObject and append to that list a dictionary with the values of the struct that I want to show to the python user.

Hope this will help someone with the same doubt, here is the code:

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; 
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download