标签:
项目地址:https://github.com/spin6lock/python-sproto
第一次写Python的C扩展,留点笔记记录一下。主要的参考文档是:Extending Python with C/C++, 之前也看过cython,但是用Python语法写C还是没学会,稍后再尝试用cython写一遍看看。
作为一个C扩展,是以Module的方式import进去代码里使用的,所以需要注册一下,把自己的接口告诉Python解释器。代码如下图:
static PyMethodDef pysproto_methods[] = { {"sproto_create", py_sproto_create, METH_VARARGS}, {"sproto_type", py_sproto_type, METH_VARARGS}, {"sproto_encode", py_sproto_encode, METH_VARARGS}, {"sproto_decode", py_sproto_decode, METH_VARARGS}, {"sproto_pack", py_sproto_pack, METH_VARARGS}, {"sproto_unpack", py_sproto_unpack, METH_VARARGS}, {"sproto_protocol", py_sproto_protocol, METH_VARARGS}, {NULL, NULL} }; PyMODINIT_FUNC initpysproto(void){ PyObject *m; m = Py_InitModule("pysproto", pysproto_methods); if (m == NULL) { return; } SprotoError = PyErr_NewException("pysproto.error", NULL, NULL); Py_INCREF(SprotoError); PyModule_AddObject(m, "error", SprotoError); }
pysproto_methods是一个数组,每个元素是一个三元组{暴露给python的方法名,对应的C函数名,参数格式},以{NULL, NULL}表示结束。
init模块名(void)是一个特殊的函数,当Python里输入import 模块名的时候,C层就会调用 init模块名 来执行模块的初始化工作。Py_InitModule表示将上面的模块方法数组暴露给Python,下面的代码向模块注册了一个SprotoError,表明模块自带的异常类型。
Python传参数给C:
参见py_sproto_create,通过PyArg_ParseTuple函数接收参数。
char *buffer; int sz = 0; struct sproto *sp; if (!PyArg_ParseTuple(args, "s#", &buffer, &sz)) { return NULL; }
标签:
原文地址:http://www.cnblogs.com/Lifehacker/p/python_sproto_introduction.html