从 C 函数构建 PyObject*?
Posted
技术标签:
【中文标题】从 C 函数构建 PyObject*?【英文标题】:Build a PyObject* from a C function? 【发布时间】:2011-07-08 14:47:09 【问题描述】:我将 Python 嵌入到我正在制作的 C++ 库中。我希望用户能够以函数指针PyObject* (fpFunc*)(PyObject*,PyObject*);
的形式传递 C 函数,以便我可以在嵌入式 Python 中使用这些函数。
所以我有一个函数指针,我知道可以使用PyMethodDef
结构将此函数作为模块的方法并将其传递给Py_InitModule("module", ModMethods);
,从而获得一个PyObject* module
,我可以轻松获取函数来自。
但是,我真正感激的是能够即时创建此函数,而不必每次都重新创建另一个模块。
我查看了 Python 文档和一些 Python 标头,以考虑一种没有真正成功的 hacky 方式......但我想知道是否有更传统的方式来做到这一点。
据我了解,每个函数都属于一个模块,即使是__builtin__
,所以我想我至少需要一个模块。
知道如何实现这一目标吗?
【问题讨论】:
我不清楚你的意思。为什么要使用函数指针?谁在设置它? 我正在制作一个嵌入 Python 的 C++ 库。我正在使用函数指针,因为它很方便传递。 (编辑了我的帖子) 【参考方案1】:找到了。虽然它不在文档中,而且在源代码中也几乎没有明确说明。
PyObject* (*fpFunc)(PyObject*,PyObject*) = someFunction;
PyMethodDef methd = "methd",fpFunc,METH_VARARGS,"A new function";
PyObject* name = PyString_FromString(methd.ml_name);
PyObject* pyfoo = PyCFunction_NewEx(&methd,NULL,name);
Py_DECREF(name);
它有效。我可以像通常调用 Python 函数对象一样调用函数。
如果你很好奇,我在文档中找到的所有内容都是关于 Py_InitModule4
和加载模块,所以我去查看 Python 的源代码,发现了 PyCFunction
,然后我在文档中四处寻找,但我不能'找不到任何关于 PyCFunction_NewEx
的信息,所以我不得不检查来源以确保它与我想的一样。
【讨论】:
以上是关于从 C 函数构建 PyObject*?的主要内容,如果未能解决你的问题,请参考以下文章
『Python CoolBook』C扩展库_其六_从C语言中调用Python代码
PyObject_GetAttrString C++ 函数返回 NULL:无法从 C++ 调用 Python 函数