python和C,我覺得這簡直是無敵的組合啊。一般性的業務邏輯用python快速出模型,而碰到python運行緩慢的操作,則可以通過調用C編譯好的鏈接庫來完成。
在python3.2下,可以通過ctype模塊單純的訪問C鏈接庫,也可以通過傳統方式訪問。ctype模塊固然方便,但若要求回調的話,還是得用傳統方式操作。
今天查閱了官方manual和網上一些鏈接,感覺有些出處,在這寫上一個3.2.2的簡單程序:
編輯一個文件lzymodule.c
按官方命名方式,前面是模塊名,後面是module.c
- #include <Python.h> //必須先include Python.h,Python.h中包含了一些預編譯宏,包括了一些stdlib.h之類的頭文件
-
- /* 將要調用的函數,我提出來了 */
- long func1(long a, long b)
- {
- return a + b;
- }
-
- /* 方法名字命名規范是“模塊名_方法名”,我這裡的方法名是system */
- static PyObject *
- lzy_system(PyObject *self, PyObject *args)
- {
- const char *command;
- long a, b;
- int sts;
-
- if (!PyArg_ParseTuple(args, "ii", &a, &b)) //讀入兩個整形參數,轉成C類型
- return NULL;
-
- //sts = system(command);
- sts = func1(a, b);
- return PyLong_FromLong(sts); //返回前,需要轉成PyObject類型
- }
-
- /* 定義模塊中的方法 */
- static PyMethodDef LzyMethods[] =
- {
- {"func", lzy_system, METH_VARARGS, "my first test function"}, //注意func是在python中調用的名字,這裡應該取system才規范
- {NULL, NULL, 0, NULL}
- };
-
- /* 定義模塊 */
- static struct PyModuleDef lzymodule =
- {
- PyModuleDef_HEAD_INIT,
- "lzy",
- NULL,
- -1,
- LzyMethods
- };
-
- /* 這個就相當於主函數了,命名一定要為“PyInit_模塊名” */
- PyMODINIT_FUNC PyInit_lzy(void)
- {
- return PyModule_Create(&lzymodule);
- }
之後進行編譯
- gcc lzymodule.c -shared -I /usr/local/include/python3.2m/ -o lzy.so -fPIC
最後進入python,試試
- import lzy
- lzy.func(1, 230)
注,不願意gcc的話,試試這個腳本 見 http://www.linuxidc.com/Linux/2012-02/55038.htm
- from distutils.core import setup, Extension
- test_mod = Extension('lzy', sources = ['lzymodule.c'])
- setup(name = 'lzy',
- version = '1.0',
- description = 'lzy test extension module',
- ext_modules = [test_mod])
- python setup.py build
- python setup.py install