Python C API - 创建关键字
Posted
技术标签:
【中文标题】Python C API - 创建关键字【英文标题】:Python C API - Creating keywords 【发布时间】:2013-06-11 13:44:41 【问题描述】:我在尝试从我的 C++ 代码中调用 Python 函数时遇到了麻烦。
我正在尝试使用以下参数调用 Django 函数 call_command:
call_command('test', stdout=content)
请参阅here 为什么。这将运行不带 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)?
【问题讨论】:
看看这对你有没有帮助:***.com/questions/145270/calling-c-c-from-python 似乎不是我想要的。我只需要了解如何创建这个 stdout 关键字并将其作为 C 中的函数调用参数传递。我不想使用 SWIG 或 Boost:Python 等外部工具。 【参考方案1】: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 的内容。
【讨论】:
【参考方案2】:Py_BuildValue("s:O", "stdout", content_obj)
【讨论】:
而您需要PyObject_Call()
来将此字典作为关键字传递。
PyObject *kw = Py_BuildValue("s:O", "stdout", PyObject_GetAttrString(PyImport_AddModule("__main__"), "content"));
产生stdout:<StringIO.StringIO instance at 0x032A0440>
我需要stdout=content
。没有荣誉,没有冒号代替 =,并且标准输出上没有引号。我没有正确理解你的答案吗?
在 Python 中,像 foo(3, x=5)
这样的调用实际上与 foo(*a,**k)
和 a = (3,), k = 'x': 5
相同。 PyObject_Call(f,a,k)
函数可以在 C 中使用,并且与 Python 中的表达式 f(*a, **k)
具有相同的含义。没有直接的 C 等效于“a keyword stdout=content”,因为这种语法在 C 中没有意义。
感谢您的解释,我得到了它的工作。我为后代选择了晨星的答案,但你们俩都解决了我的问题:)谢谢。以上是关于Python C API - 创建关键字的主要内容,如果未能解决你的问题,请参考以下文章
在 web 应用程序中使用基于 C 的 API(混乱)的 Javascript 扩展