带有关键字参数的PyObject_CallMethod

Tam*_*ege 7 python python-embedding python-c-api python-2.7

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

myobject.dosomething('blahdy blah', somearg=True)
Run Code Online (Sandbox Code Playgroud)

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

PyObject_CallMethod(myobject, "dosomething", "s", "blahdy blah");
Run Code Online (Sandbox Code Playgroud)

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

clw*_*ght 7

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);
Run Code Online (Sandbox Code Playgroud)

当然,如果Python代码中有任何错误或异常,一些PyObjects将为NULL,并且您的程序可能会崩溃.检查NULL结果和/或使用Py_DECREFX()可以帮助您避免这种情况.


Tam*_*ege 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);
Run Code Online (Sandbox Code Playgroud)