1.Python 的C API 由C源码组成,并包含 “Python.h” 头文件
2.包装函数 PyObject * Module_func(PyObject *self,PyObject *args){...}
self 参数仅用于用C实现内置方法。如果定义的是函数,self为NULL。
args参数是一个指向Python的 tuple 对象的指针。每个tuple子项对应一个调用参数,这些参数全都是Python对象,所以需要先转成C值。
3.int PyArg_ParseTuple(PyObject *args,const char *format,...)
检查参数类型并转换成C值,使用模板字符串检测需要的参数类型。成功则返回1,出错返回0。
4.关于错误和异常
一个常见惯例是,函数发生错误时,应该设置一个异常环境并返回错误值(NULL)。异常存储在解释器静态全局变量中。
5.模块方法表
把函数声明为可以被Python调用,需要先定义一个方法表:
//模块方法表,包含多个数组,每个数组包含一个函数的信息
static PyMethodDef ExtestMethods[]={
{"fac",Extest_fac,METH_VARARGS},
{"reverse",Extest_reverse,METH_VARARGS},
{NULL,NULL} //NULL数组表示结尾
};
其中,METH_VARARGS 常量表示参数以元组形式传入。
6.模块定义结构
//模块定义结构,保存创建一个模块对象所需的全部信息。
static struct PyModuleDef ExtestModule={
PyModuleDef_HEAD_INIT,
"Extest", //模块名称
NULL, //模块文档
-1,
ExtestMethods //方法数组
};
7.模块初始化函数
//模块初始化函数,函数名必须为"PyInit_模块名"
PyMODINIT_FUNC PyInit_Extest() {
return PyModule_Create(&ExtestModule);//创建一个模块对象
}