2013-05-27 24 views
5

Próbuję osadzić bibliotekę Python (2.7) w mojej aplikacji C i używam API języka Python/C do wywoływania kodu Pythona z C. Potrzebuję wywołać metodę Pythona, która przyjmuje słowo kluczowe argumenty. Semantycznie, staram się osiągnąć równowartość następującą linię w Pythonie:PyObject_CallMethod z argumentami słów kluczowych

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

Czytając documentation, udało mi się dostać w miarę dalszej części, ale to nie przechodzi w argumentach słów kluczowych :

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

nie jestem bardzo obeznany z Pythonem a ja niby tkwi w tym momencie, gdy dokumentacja nie jest do końca jasne w tej sprawie i wyszukiwania Google nie pojawił się wiele przydatnych informacji albo. Byłbym wdzięczny za każdą pomoc.

+2

Wygląda na to, że nie ma funkcji, która wywołuje metodę z argumentami słów kluczowych. Przynajmniej patrząc na to (http://mail.python.org/pipermail/python-dev/2007-June/073661.html). Jednak 'PyObject_Call' zawsze działa. – Bakuriu

+0

@Bururiu: dzięki za podpowiedź! W końcu to właśnie zrobiłem. –

Odpowiedz

6

W końcu użyłem do tego celu PyObject_Call (dzięki Bakuriu za podpowiedź!). Na wypadek, gdyby ktoś zastanawiał się, jak to zrobić, oto mój kod:

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

Odpowiedź Tamasa pozwoli wykonać zadanie, ale spowoduje również wyciek pamięci. Aby uniknąć przecieków, należy

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

Oczywiście, jeśli są jakieś błędy lub wyjątki w kodzie Pythona niektóre PyObjects będzie NULL i Twój program będzie prawdopodobnie awarii. Sprawdzanie wyników NULL i/lub używanie Py_DECREFX() może pomóc ci uniknąć tego.