C++扩展Python

By | 2018年1月24日

最近在写一个小项目,需要用到C++ Python扩展功能。

主要用到以下这些功能:

  1.  Python 调用C++的代码
  2. 在C++代码中回调Python代码

官网文档见:https://docs.python.org/3/extending/extending.html#calling-python-functions-from-c

要在Python中调用C++的代码

需要将C++代码编译成动态库(此动态库即Python可用的模块),并且需要按照一定的格式定义需要被Python调用的函数

如下:

假如模块名称为mymodule,则需要按如下格式定义一个名为initmymodule的函数

PyMODINIT_FUNC initmymodule(void) {

(void) Py_InitModule(“mymodule”, MyModuleMethods);

}

其中MyModuleMethods是一个可被Python调用的函数列表,其格式如下:

static PyMethodDef MyModuleMethods[] = {
{
“func1”,
func1,
METH_VARARGS,
“”
},
{
“func2”,
func2,
METH_VARARGS,
“”
},
{
“set_callback”,
set_callback,
METH_VARARGS,
“”
},
{NULL, NULL, 0, NULL}
};

其中””括起来的部分,例如”func1″是Python中可以调用的函数名称,func1是C++实现部分,

参考如下:

static PyObject * func1(PyObject *self, PyObject *args)
{
char* username;
char* passwd;
int res;
if (!PyArg_ParseTuple(args, “ss”, &username,&passwd))
return NULL;
cout<<username<<endl;
cout<<passwd<<endl;
return PyLong_FromLong(res);
}

以上实现了从Python传入username 和password,C++将其打印出来的功能

PyArg_ParseTuple,用来解析从Python传过来的参数,具体参数格式可参阅官网。

在C++中回调Python的代码

与上一部分类似,首先要在Python代码中调用C++代码,传入参数为Python的函数名称

set_callback(PyObject *dummy, PyObject *args)
{
    cout<<__FUNCTION__<<endl;
    PyObject *result = NULL;
    PyObject *temp;
 
    if (PyArg_ParseTuple(args, “O:set_callback”, &temp)) {
        if (!PyCallable_Check(temp)) {
            PyErr_SetString(PyExc_TypeError, “parameter must be callable”);
            return NULL;
        }
        Py_XINCREF(temp);         /* Add a reference to new callback */
        Py_XDECREF(my_callback);  /* Dispose of previous callback */
        my_callback = temp;       /* Remember new callback */
        /* Boilerplate to return “None” */
        Py_INCREF(Py_None);
        result = Py_None;
    }
    return result;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注