***************************************************************************************************
(1)希望作为模块接口呈现的C函数;
(2)将Python开发人员所看到的那些函数的名称映射为扩展模块中的C函数的一个表;
(3)初始化函数;
大多数扩展模块可以包含在一个单独的C源文件中,这个文件被称为胶水文件,启动包含Python.h的文件,它允许访问内部的PythonAPI,这些API将模块与解释器相关联。下面分别来讲解上述的三个部分。
****************************************************************************************************
C函数签名:
函数的C语言实现的签名总是采用如下三个形式之一
(1)PyObject *MyFunction(PyObject *self , PyObject *args);
(2)PyObject *MyFunction(PyObject *self , PyObject *args , PyObject*kw);
(3)PyObject *MyFunction(PyObject *self);
通常,C函数会采用第一种形式,传递到这些函数中的参数被包装成一个元组,为了使用这些参数,必须分解它们,可以使用PyArg_ParseTuple函数和PyArg_ParseTupleAndKeywords函数
PyArg_ParseTuple(args , "ids" , &i ,&d , &s)
将args分成int , double , char*,分别存入i , d , s
****************************************************************************************************
方法表:
方法表是PyMethodDef结构的一个简单数组
struct PyMethodDef
{
};
ml_flags向解释器表明ml_meth正使用三个签名中的哪一个。ml_flags的值通常是METH_VARARGS。如果希望将关键字参数引入到函数中,那么这个值可以与METH_KEYWORDS按位或。它的值也可以是METH_NOARGS,表示不希望接受任何形式的参数。
下面是是一个例子,包含函数MyFunction的表:
static PyMethodDef myFunction[] = {
};
****************************************************************************************************
初始化函数:
扩展模块的最后一部分是初始化函数。当模块被加载时,Python解释器调用此函数。需要将函数命名为init模块名,例如initChenhuan,模块名为Chenhuan
****************************************************************************************************
下面是一个典型的C扩展模块:
![Python:C语言扩展 Python:C语言扩展](https://i-blog.csdnimg.cn/blog_migrate/6f7fff9217e2b77814dd6fb12e436f01.jpeg)
个人比较喜欢用g++来编译,error和warming区分的很清楚,格式如下:
g++ -Wall -shared -I /usr/local/python2.6foo.c -o foo.so
成功的话,会在文件夹下生成foo.so,就可以使用这个模块了:
![Python:C语言扩展 Python:C语言扩展](https://i-blog.csdnimg.cn/blog_migrate/36156f3cfbd9a0aa4d5676accab59e38.jpeg)