2013-05-27 208 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()可以帮助您避免这种情况。

相关问题