11

我将 Python 嵌入到我正在制作的 C++ 库中。我希望用户能够以函数指针的形式传递 C 函数,PyObject* (fpFunc*)(PyObject*,PyObject*);以便我可以在嵌入式 Python 中使用这些函数。

所以我有一个函数指针,我知道可以使用PyMethodDefstruct 将此函数作为模块的方法并将其传递给Py_InitModule("module", ModMethods);,从而获得一个PyObject* module我可以轻松从中获取函数的函数。

但是,我真正欣赏的是能够即时创建此功能,而不必每次都重新创建另一个模块。

我已经查看了 Python 文档和一些 Python 标头,以考虑一种没有真正成功的 hacky 方式......但我想知道是否有更传统的方式来做到这一点。

据我了解,每个函数都属于一个模块,甚至__builtin__,所以我想我至少需要一个模块。

关于如何实现这一目标的任何想法?

4

1 回答 1

25

找到了。尽管它不在文档中,而且在源代码中也几乎没有明确说明。

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 的源代码,发现了 about PyCFunction,然后我在文档中四处寻找,但我找不到任何关于的东西PyCFunction_NewEx,所以我有检查来源以确保它与我想的一样。

于 2011-07-08T15:35:06.287 回答