从C函数构建PyObject *?

发布于 2021-01-29 15:59:47

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

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

但是,我真的很感激能够即时创建此功能,而不必每次都重新创建另一个模块。

我研究了Python文档和一些Python标头,以考虑采用骇人听闻的方式来实现此目的而没有真正的成功……但是我想知道是否还有更常规的方式来做到这一点。

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

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

关注者
0
被浏览
42
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    找到了。尽管它不在文档中,并且在源代码中也很难明确显示。

    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,所以我有了检查源以确保它是我所想的。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看