2013-04-03 10 views
9

को सी से structs की सरणी पारित करने के लिए एक अजगर मॉड्यूल मैं बना रहा हूं, तो मैं इस तरह structs की एक सरणी अजगर उपयोगकर्ता को भेजना चाहते हैं:अजगर सी एपीआई कैसे अजगर

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 वह फ़ंक्शन था जिसे मैं ढूंढ रहा था। लेकिन ऐसा लगता है कि यह नहीं है। पायथन दस्तावेज में देखकर मुझे Buffer Protocol मिला। लेकिन पहली बार जब मैं एक अजगर मॉड्यूल विकसित कर रहा हूं और आधिकारिक दस्तावेज ने मुझे बहुत मदद नहीं की है।

क्या बफर प्रोटोकॉल मेरी समस्या का सबसे अच्छा समाधान है? यदि हां, तो मैं अपनी सरणी सी से पायथन तक कैसे लौटा सकता हूं?

+2

अपने अनुसरणकर्ताओं की कोशिश की है .. http://stackoverflow.com/questions/4351721/python-ctypes-passing- एक-स्ट्रक्चर-टू-ए-फ़ंक्शन-ए-पॉइंटर-टू-गेट-बैक-डेटा http://forums.indiegamer.com/showthread.php?14280-Embending-Python-into-CC-how -to-send-aC-struct-to-Python –

+1

@HirenPandya: afaik 'ctypes'! = 'पायथन सी एपीआई'! – Constantinius

उत्तर

7

फिनली ने जो किया है वह PyListObject के साथ ऑब्जेक्ट सूची बना रहा था और उस सूची को उस स्ट्रिंग के मानों के साथ जोड़ना चाहता था जिसे मैं अजगर उपयोगकर्ता को दिखाना चाहता हूं।

आशा यह एक ही संदेह के साथ किसी में मदद मिलेगी, यहाँ कोड है:

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

क्या आपके पास पूरी संरचना को केवल एक विशेष दायर न करने का समाधान था? – P0W

+0

नहीं, मैंने नहीं किया है। लेकिन मुझे लगता है कि अगर आप पूरे नियम को वापस करना चाहते हैं, तो शायद 'वापसी (पायओब्जेक्ट *) dict; 'काम कर सकता है। क्षमा करें, लेकिन मेरे पास यह साबित करने के लिए कोड नहीं है। – elbaulp