如何使用 Python C/C++ 接口将实例成员函数作为 PyCFunction 类型传递
Posted
技术标签:
【中文标题】如何使用 Python C/C++ 接口将实例成员函数作为 PyCFunction 类型传递【英文标题】:How do I pass a instance member function as a PyCFunction type using the Python C/C++ Interface 【发布时间】:2014-04-04 17:51:33 【问题描述】:我正在尝试将 python 嵌入到现有的 C++ 应用程序中。但是我一直试图从 python 脚本中调用实例成员函数。
我有一个现有的类,其中我有一个私有成员函数,它包装了本机函数并满足 PyCFunction 接口。
class MY_CLASS
public:
void MY_CLASS();
void submit(TypeA a, int b);
private:
PyObject* PythonMethod_submit(PyObject*, PyObject*);
当我创建 PyMethodDef 时,我使用方法名称来标识我想要的函数,但是我收到一个编译错误,表明我必须使用错误的类型签名。
MY_CLASS::MY_CLASS()
// Python C/API Intilization stuff
PyMethodDef ModuleMethods[] =
"submit",
PythonMethod_submit,
METH_VARARGS,
"docstring"
;
Py_InitModule("myclass", ModuleMethods);
// Further interaction with the embeded interpreter
如果我使用 Python C API 中描述的静态函数,则此过程有效,当我使用类成员时,我收到错误断言 PyObject* (MY_CLASS::)(PyObject*, PyObject*) does not match PyObject* (*)(PyObject*, PyObject*)
。
是否可以按照错误中的说明将成员函数作为函数指针传递?
【问题讨论】:
【参考方案1】:没有。非静态成员函数具有隐式传入的MY_CLASS *
(如this
),而行为类似于C 函数的静态成员函数则没有。有关不同类型的签名,请参阅此页面:http://www.parashift.com/c++-faq/fnptr-vs-memfnptr-types.html
作为替代方案,您可以在 Python 对象中拥有一个成员,该成员包含指向 C++ 对象的指针 (MY_CLASS *
)。
【讨论】:
以上是关于如何使用 Python C/C++ 接口将实例成员函数作为 PyCFunction 类型传递的主要内容,如果未能解决你的问题,请参考以下文章