如何从C函数构建PyObject*?

12 投票
1 回答
4347 浏览
提问于 2025-04-16 21:06

我正在开发一个C++库,并想把Python嵌入到里面。我希望用户能够通过函数指针的方式传递C语言的函数,格式是PyObject* (fpFunc*)(PyObject*,PyObject*);,这样我就可以在嵌入的Python中使用这些函数。

我有一个函数指针,我知道可以通过PyMethodDef结构把这个函数作为模块的方法,然后传递给Py_InitModule("module", ModMethods);,这样就能得到一个PyObject* module,我可以很方便地从中获取函数。

但是,我希望能够动态创建这个函数,而不需要每次都重新创建一个新的模块。

我查阅了Python的文档和一些Python的头文件,想找个简单的方法来实现这个,但没有成功……我在想有没有更常规的方式来做到这一点。

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

有没有什么想法可以实现这个呢?

1 个回答

27

找到了。虽然在文档里没有说明,而且源代码里也不太明显。

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 的相关信息,所以我只好查看源代码来确认我的想法。

撰写回答