从C函数构建PyObject*?

Man*_*nux 11 c python python-c-api

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

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

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

我已经研究了Python文档,以及一些Python头文件,想到了一个没有真正成功的hacky方法...但我想知道是否有更传统的方法来做到这一点.

根据我的理解,每个函数都属于一个模块,甚至__builtin__,所以我想我至少需要模块.

有关如何实现这一点的任何想法?

Man*_*nux 23

找到了.虽然它不在文档中,但在源代码中并不明确.

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);
Run Code Online (Sandbox Code Playgroud)

有用.我可以调用函数,就像我通常会调用Python函数对象一样.

如果你很好奇,我在文档中找到的只是关于Py_InitModule4并加载模块,所以我去检查Python的来源,并发现了PyCFunction,然后我在文档中查看但我找不到任何关于PyCFunction_NewEx,所以我有检查来源以确保它像我想的那样.