4

我在尝试从我的 C++ 代码中调用 Python 函数时遇到了麻烦。

我正在尝试使用以下参数调用 Django 函数 call_command:

    call_command('test', stdout=content)

看看这里为什么。这将运行不带 stdout=content 参数的命令:

    PyObject_CallFunctionObjArgs(executeFunc, PyString_FromString("test"), NULL)

在我的一生中,我无法弄清楚如何创建这个关键字。

    PyDict_New();
    PyDict_SetItemString(...);

给我一个 'stdout'='content' 字符串,而不是 stdout=content。

    Py_BuildValue("{s=s}", ... , ...) 

做同样的事情。

如有必要,我可以毫无问题地获取内容 PyObject,我似乎无法正确创建 stdout 关键字参数,而 Python 在某些时候没有加上引号(将其作为字符串处理)。

如何从 C API 调用 call_command('test', stdout=content) ?

4

2 回答 2

2
PyObject *args = Py_BuildValue("(s)", "test");
PyObject *kwargs = PyBuildValue("{s:O}", "stdout", content);

PyObject_Call(executeFunc, args, kwargs);

请注意,即使在 Python 中,您也可以以相同的方式调用该函数:

args = ("test",)
kwargs = {"stdout" : content}

call_command(*args,**kwargs)

“stdout”也是一个带引号的字符串,但它有效。您试图获得与 Python 中使用的语法相同的语法,即 noquotename=noquotevalue,但语法只是一种表示形式。{"quotedname" : noquotevalue} 和 noquotename=noquotevalue 都是表示同一事物的两种不同方式。它们实际上都表示一个字典,其键是字符串,值是对象。这就是您作为第三个参数传递给 PyObject_Call 的内容。

于 2013-06-11T15:44:34.657 回答
1

Py_BuildValue("{s:O}", "stdout", content_obj)

于 2013-06-11T14:15:56.067 回答