从C函数构建PyObject *?

时间:2011-07-08 14:47:09

标签: python c python-c-api

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

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

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

我已经研究过Python文档,以及一些Python标题来考虑一种没有真正成功的hacky方式......但我想知道是否有更传统的方法来做到这一点。

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

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

1 个答案:

答案 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的任何内容,所以我必须检查来源以确保它符合我的想法。