2013-05-27 24 views
5

Sto cercando di incorporare una libreria Python (2.7) nella mia applicazione C e sto usando l'API Python/C per chiamare il codice Python da C. Ho bisogno di chiamare un metodo Python che prende la parola chiave argomenti. Semanticamente, sto cercando di ottenere l'equivalente della riga seguente in Python:PyObject_CallMethod con argomenti parola chiave

myobject.dosomething('blahdy blah', somearg=True) 

Leggendo il documentation, sono riuscito a ottenere per quanto riguarda il seguito, ma questo non passa la parola argomenti :

PyObject_CallMethod(myobject, "dosomething", "s", "blahdy blah"); 

io non sono super familiarità con Python e sto tipo di bloccato a questo punto come la documentazione non è del tutto chiaro su questo e ricerche di Google non si presentò informazioni molto utili sia. Apprezzerei qualsiasi aiuto.

+2

Sembra che non esista una funzione che chiama un metodo con argomenti di parole chiave. Almeno, guardando [questo] (http://mail.python.org/pipermail/python-dev/2007-June/073661.html). Tuttavia, 'PyObject_Call' funziona sempre. – Bakuriu

+0

@Bakuriu: grazie per il suggerimento! Alla fine, è esattamente quello che ho finito per fare. –

risposta

6

Alla fine ho usato PyObject_Call per fare questo (grazie a Bakuriu per il suggerimento!). Solo nel caso qualcuno si chiede come fare, ecco il mio codice:

PyObject *args = Py_BuildValue("(s)", "blahdy blah");  
PyObject *keywords = PyDict_New(); 
PyDict_SetItemString(keywords, "somearg", Py_True); 

PyObject_Call(PyObject_GetAttrString(myobject, "do something"), args, keywords); 
Py_DECREF(args); 
Py_DECREF(keywords); 
5

risposta di Tamas otterrà il lavoro fatto, ma sarà anche una perdita di memoria. Per evitare perdite, utilizzare

PyObject *args = Py_BuildValue("(s)", "blahdy blah");  
PyObject *keywords = PyDict_New(); 
PyDict_SetItemString(keywords, "somearg", Py_True); 
PyObject *myobject_method = PyObject_GetAttrString(myobject, "do something"); 

PyObject *result = PyObject_Call(myobject_method, args, keywords); 
Py_DECREF(args); 
Py_DECREF(keywords); 
Py_DECREF(myobject_method); 

// Do something with the result 

Py_DECREF(result); 

Naturalmente, se ci sono errori o eccezioni nel codice Python alcuni dei PyObjects sarà nulla e il programma sarà probabilmente in crash. Il controllo dei risultati NULL e/o l'uso di Py_DECREFX() può aiutarti a evitare questo.

Problemi correlati