我正在尝试在我的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并不是很熟悉,因为文档在这方面并不完全清楚,而且谷歌搜索也没有提供太多有用的信息。我很感激任何帮助。
答案 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()
可以帮助您避免这种情况。