码迷,mamicode.com
首页 > 编程语言 > 详细

为sproto添加python绑定

时间:2015-03-19 20:09:14      阅读:394      评论:0      收藏:0      [点我收藏+]

标签:

项目地址: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;
    }

 

为sproto添加python绑定

标签:

原文地址:http://www.cnblogs.com/Lifehacker/p/python_sproto_introduction.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!