為sproto添加python綁定

來源:互聯網
上載者:User

標籤:

項目地址: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_FUNCinitpysproto(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綁定

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.