10

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?

Alejandro Alcalde
  • 5,990
  • 6
  • 39
  • 79
  • 2
    Have you tried followings.. http://stackoverflow.com/questions/4351721/python-ctypes-passing-a-struct-to-a-function-as-a-pointer-to-get-back-data http://forums.indiegamer.com/showthread.php?14280-Embending-Python-into-C-C-how-to-send-a-C-structure-to-Python – Hiren Pandya Apr 03 '13 at 11:53
  • 1
    @HirenPandya: afaik `ctypes` != `Python C API`! – Constantinius Apr 03 '13 at 14:18

1 Answers1

8

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; 
Alejandro Alcalde
  • 5,990
  • 6
  • 39
  • 79