2013-04-03 14 views
9

dla modułu Pythona tworzę, chcę przekazać użytkownikowi Pythona tablicę kodowanym tak:Python C API Jak przekazać tablicę kodowanym z C na Pythona

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

Myślałem, że Py_BuildValues była funkcją, której szukałem. Ale wydaje się, że tak nie jest. Patrząc w dokumentacji Pythona znalazłem Buffer Protocol. Ale po raz pierwszy opracowuję moduł Pythona, a oficjalna dokumentacja mi nie pomogła.

Czy protokół buforowy jest najlepszym rozwiązaniem dla mojego problemu? Jeśli tak, to w jaki sposób mogę zwrócić tablicę z C do Pythona?

+2

Czy próbowałeś poniższych .. 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-CC-how -to-send-aC-structure-to-Python –

+1

@HirenPandya: afaik 'ctypes'! =' Python C API'! – Constantinius

Odpowiedz

7

Ostatecznie zrobiłem listę obiektów z PyListObject i dołączyłem do tej listy słownik z wartościami struktury, które chcę pokazać użytkownikowi Pythona.

nadzieję, że pomoże ktoś z tym samym wątpliwości, oto kod:

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; 
+1

Czy masz rozwiązanie, aby wysłać całą strukturę, a nie tylko konkretny plik? – P0W

+0

Nie, nie mam. Ale myślę, że jeśli chcesz zwrócić cały dykt, być może 'return (PyObject *) dict;' może działać. Przepraszam, ale nie mam kodu, żeby to udowodnić. – elbaulp