带有关键字参数的PyObject_CallMethod

时间:2013-05-27 16:24:03

标签: python python-2.7 python-c-api python-embedding

我正在尝试在我的C应用程序中嵌入一个Python(2.7)库,我正在使用Python / C API从C调用Python代码。我需要调用一个带有关键字参数的Python方法。在语义上,我试图在Python中实现以下行的等价物:

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

通过阅读documentation,我已设法获得以下内容,但这不会传递关键字参数:

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

我对Python并不是很熟悉,因为文档在这方面并不完全清楚,而且谷歌搜索也没有提供太多有用的信息。我很感激任何帮助。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:6)

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并且您的程序可能会崩溃。检查NULL结果和/或使用Py_DECREFX()可以帮助您避免这种情况。