【问题标题】:PyObject_CallMethod with keyword arguments带有关键字参数的 PyObject_CallMethod
【发布时间】:2013-05-27 16:24:02
【问题描述】:

我正在尝试在我的 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 不是很熟悉,我有点卡在这一点上,因为文档对此并不完全清楚,而且 Google 搜索也没有找到太多有用的信息。如有任何帮助,我将不胜感激。

【问题讨论】:

  • 似乎没有一个函数可以调用带有关键字参数的方法。至少,看看this。但是,PyObject_Call 始终有效。
  • @Bakuriu:感谢您的提示!最后,这正是我最终所做的。

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


【解决方案1】:

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

【讨论】:

  • 请注意,如果您没有参数但只想传入关键字参数,如果您调用类似 pd.to_json(orient="table")' 的内容,那么您不能将 null 传递给 args,而是创建一个空元组 @987654324 @ 并将其作为第二个参数传递给PyObject_Call
【解决方案2】:

最后我使用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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    相关资源
    最近更新 更多