標籤:
項目地址: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綁定