从 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 C 模块函数参数引用计数

Python:从 C 函数中确定模块名称

『Python CoolBook』C扩展库_其六_从C语言中调用Python代码

PyObject_GetAttrString C++ 函数返回 NULL:无法从 C++ 调用 Python 函数

从 C++ 函数 Cython 返回包含 PyObject 的复杂对象

分析回调到 Python 的 C 扩展