2013-05-27 202 views
5

我想在我的C應用程序中嵌入一個Python(2.7)庫,我使用Python/C API從C調用Python代碼。我需要調用一個Python方法,它採用關鍵字參數。語義,我試圖達到以下行的Python中的等價物:PyObject_CallMethod與關鍵字參數

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

通過閱讀documentation,我設法儘量讓儘可能以下,但這並不在關鍵字參數傳遞:

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

我不是超級熟悉Python,我種停留在這一點上,如文檔是不是這完全清楚和谷歌搜索沒有任何露面了很多有用的信息。我會很感激任何幫助。

+2

看起來好像沒有調用帶關鍵字參數的方法的函數。至少,看看[這個](http://mail.python.org/pipermail/python-dev/2007-June/073661.html)。但是,'PyObject_Call'總是有效的。 – Bakuriu

+0

@Bakuriu:謝謝你的提示!最後,這正是我最終做的。 –

回答

6

最後我用PyObject_Call來做到這一點(感謝Bakuriu的提示!)。以防萬一有人想知道如何做到這一點,這裏是我的代碼:

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

Tamas的答案將完成工作,但它也會泄漏內存。爲了避免泄密,使用

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

當然,如果有在Python代碼中的任何錯誤或異常的一些PyObjects的將是無效和你的程序可能會崩潰。檢查NULL結果和/或使用Py_DECREFX()可以幫助您避免這種情況。

相關問題