如何从C函数构建PyObject*?
我正在开发一个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
的相关信息,所以我只好查看源代码来确认我的想法。