2013-04-03 5 views
9

Per un modulo python che sto creando, voglio passare per l'utente pitone un array di struct come questo:Python API C Come passare array di struct da C a 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; 
}; 

ho pensato che Py_BuildValues era la funzione che stavo cercando. Ma sembra che non lo sia. Guardando nella documentazione di Python ho trovato il Buffer Protocol. Ma è la prima volta che sviluppo un modulo Python e la documentazione ufficiale non mi aiuta molto.

Il protocollo di buffer è la soluzione migliore per il mio problema? In tal caso, come potrei restituire il mio array da C a python?

+2

Hai provato seguenti .. 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'! =' API Python C! '! – Constantinius

risposta

7

Finalmente ciò che ho fatto è stato creare un elenco di oggetti con PyListObject e aggiungere all'elenco un dizionario con i valori della struttura che voglio mostrare all'utente python.

Spero che questo vi aiuterà qualcuno con lo stesso dubbio, ecco il codice:

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

Hai una soluzione per inviare l'intera struttura non solo un particolare file? – P0W

+0

No, non ho. Ma penso che se vuoi restituire l'intero dict, forse 'return (PyObject *) dict;' può funzionare. Scusa ma non ho il codice per dimostrarlo. – elbaulp