C语言扩展Python模块

时间:2023-03-08 21:11:20
C语言扩展Python模块

1. 先创建一个PythonDemo.cpp文件:

//c/c++中调用python脚本,配置步骤参见上一篇:C/C++与python交互 \  C/C++中调用python文件。

#include "Python.h"

然后定义一个模块的初始化函数

PyMODINIT_FUNC initlc_hello_world(void)
{
  Py_InitModule("lc_hello_world",lc_hello_world_methods);
}

  这个函数是用于模块初始化的,即是在第一次使用import语句导入模块时会执行。其函数名必须为initmodule_name这样的格式,在这里我们的模块名为lc_hello_world,所以函数名就是initlc_hello_world。

  在这个函数中又调用了PyInitModule函数,它执行了模块的初始化操作。Py_InitModule函数传入了两个参数,第一个参数为字符串,表示模块的名称;第二个参数是一个Py_MethodDef的结构体数组,表示该模块都具有哪些方法。因此在initlc_hello_world方法之前还需要先定义lc_hello_world_methods数组。

static PyMethodDef lc_hello_world_methods[]=

{

  {"test",test_function,METH_VARARGS,"lc_hello_world extending test"},

  {NULL,NULL,0,NULL}

};

PyMethodDef结构体有四个字段。

第一个是字符串,表示在Python文件中对应的方法的名称;

第二个是对应的C代码的函数名称;

第三个是一个标志位,表示该Python方法是否需要参数,METH_NOARGS表示不需要参数,METH_VARARGS表示需要参数;

第四个是一个字符串,它是该方法的__doc__属性,这个不是必须的,可以为NULL。

PyMethodDef结构体数组最后以{NULL,NULL,0,NULL}结尾。

C代码实现lc_hello_world_methods中定义的test_function函数:

PyObject*  test_function(PyObject *self,PyObject *args)

{

  PyObject  *pObject = NULL;

  int nThread = 0;

  int nCalcData = -1;

  int isDebug = 0,isCalcHis = 0;

  if(!PyArg_ParseTuple(args,"oiii",&pObject,&nThread,&nCalcData,&isDebug,&isCalcHis))

  {

    PyErr_Print();

    return NULL;

  }

  return  Py_True;

}

编译:

扩展模块编写完成后,接下来就是对其进行编译了。先写一个setup.py脚本:

from setuptools import setup,Extension

hello_world = Extension('lc_hello_world',sources=['PythonDemo.py'])

setup(ex_modules=[hello_world])

然后执行命令进行编译:

python setup.py build

如果报错,得先安装setuptools,步骤如下:

1.下载ez_setup.py到某一个目录(如: e:\tools\ez_setup.py)下载地址: https://bootstrap.pypa.io/ez_setup.py

2.cmd进入e:\tools,运行python ez_setup.py

setuptools安装完毕之后:

将setup.py拷贝至PythonDemo.cpp文件目录下;

再执行python setup.py build

C语言扩展Python模块

项目加载上面生成的lib之后:

PythonDemo.cpp中测试模块是否可用:

Py_InitModule("lc_hello_world",lc_hello_world_methods);

//c语言扩展python
//执行start函数
pFunc = PyObject_GetAttrString(pModule,"Start");
pArg = Py_BuildValue("(s)","hello xiaochun");//随便传一个元组
PyEval_CallObject(pFunc,pArg);//使lc_hello_world.test映射到test_function()函数

C语言扩展Python模块

C语言扩展Python模块

Demo.py

C语言扩展Python模块

Demo程序:

  百度云(13207134391):

    CC++中调用Python\PythonDemo