从C函数构建PyObject *?
我将Python嵌入正在制作的C ++库中。我希望用户能够以函数指针的形式传递C函数,PyObject*
(fpFunc*)(PyObject*,PyObject*);
以便可以在嵌入式Python中使用这些函数。
因此,我有一个函数指针,并且我知道可以使用一个PyMethodDef
结构将该函数作为模块的方法并将其传递给它Py_InitModule("module",
ModMethods);
,从而获得一个PyObject* module
我可以轻松从中获取函数的函数。
但是,我真的很感激能够即时创建此功能,而不必每次都重新创建另一个模块。
我研究了Python文档和一些Python标头,以考虑采用骇人听闻的方式来实现此目的而没有真正的成功……但是我想知道是否还有更常规的方式来做到这一点。
据我了解,每个函数甚至都属于一个模块__builtin__
,所以我想至少需要一个模块。
关于如何实现这一点的任何想法?
-
找到了。尽管它不在文档中,并且在源代码中也很难明确显示。
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
,所以我有了检查源以确保它是我所想的。