我将Python嵌入到我正在制作的C ++库中。我希望用户能够以函数指针PyObject* (fpFunc*)(PyObject*,PyObject*);
的形式传递C函数,以便我可以在嵌入式Python中使用这些函数。
所以我有一个函数指针,我知道可以使用PyMethodDef
结构将此函数作为模块的方法,并将其传递给Py_InitModule("module", ModMethods);
,从而获得PyObject* module
我可以轻松地从中获取功能。
但是,我真正欣赏的是能够动态创建这个功能,而不必每次都重新创建另一个模块。
我已经研究过Python文档,以及一些Python标题来考虑一种没有真正成功的hacky方式......但我想知道是否有更传统的方法来做到这一点。
根据我的理解,每个函数都属于一个模块,甚至__builtin__
,所以我想我至少需要模块。
关于如何实现这一目标的任何想法?
答案 0 :(得分: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);
有效。我可以调用函数,就像我通常会调用Python函数对象一样。
如果你很好奇,我在文档中找到的只是Py_InitModule4
和加载模块,所以我去查看Python的来源,发现了PyCFunction
,然后我环顾了一下doc但我找不到关于PyCFunction_NewEx
的任何内容,所以我必须检查来源以确保它符合我的想法。