9

我试图在我的 C 应用程序中嵌入一个 Python (2.7) 库,并且我正在使用 Python/C API 从 C 调用 Python 代码。我需要调用一个接受关键字参数的 Python 方法。从语义上讲,我试图在 Python 中实现与以下行等效的内容:

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

通过阅读文档,我设法做到了以下几点,但这并没有传递关键字参数:

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

我对 Python 不是很熟悉,我有点卡在这一点上,因为文档对此并不完全清楚,而且谷歌搜索也没有找到太多有用的信息。我会很感激任何帮助。

4

2 回答 2

8

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

于 2014-07-30T17:33:59.150 回答
7

最后我使用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);
于 2013-05-29T11:34:01.270 回答