歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Python 3.2下調用C動態鏈接庫

python和C,我覺得這簡直是無敵的組合啊。一般性的業務邏輯用python快速出模型,而碰到python運行緩慢的操作,則可以通過調用C編譯好的鏈接庫來完成。

在python3.2下,可以通過ctype模塊單純的訪問C鏈接庫,也可以通過傳統方式訪問。ctype模塊固然方便,但若要求回調的話,還是得用傳統方式操作。

今天查閱了官方manual和網上一些鏈接,感覺有些出處,在這寫上一個3.2.2的簡單程序:

編輯一個文件lzymodule.c

按官方命名方式,前面是模塊名,後面是module.c

  1. #include <Python.h> //必須先include Python.h,Python.h中包含了一些預編譯宏,包括了一些stdlib.h之類的頭文件   
  2.   
  3. /* 將要調用的函數,我提出來了 */  
  4. long func1(long a, long b)   
  5. {   
  6.     return a + b;   
  7. }   
  8.   
  9. /* 方法名字命名規范是“模塊名_方法名”,我這裡的方法名是system */  
  10. static PyObject *   
  11. lzy_system(PyObject *self, PyObject *args)   
  12. {   
  13.     const char *command;   
  14.     long a, b;   
  15.     int sts;   
  16.   
  17.     if (!PyArg_ParseTuple(args, "ii", &a, &b)) //讀入兩個整形參數,轉成C類型   
  18.         return NULL;   
  19.   
  20.     //sts = system(command);   
  21.     sts = func1(a, b);   
  22.     return PyLong_FromLong(sts); //返回前,需要轉成PyObject類型   
  23. }   
  24.   
  25. /* 定義模塊中的方法 */  
  26. static PyMethodDef LzyMethods[] =   
  27. {   
  28.     {"func", lzy_system, METH_VARARGS, "my first test function"}, //注意func是在python中調用的名字,這裡應該取system才規范   
  29.     {NULL, NULL, 0, NULL}   
  30. };   
  31.   
  32. /* 定義模塊 */  
  33. static struct PyModuleDef lzymodule =   
  34. {   
  35.     PyModuleDef_HEAD_INIT,   
  36.     "lzy",   
  37.     NULL,   
  38.     -1,   
  39.     LzyMethods   
  40. };   
  41.   
  42. /* 這個就相當於主函數了,命名一定要為“PyInit_模塊名” */  
  43. PyMODINIT_FUNC PyInit_lzy(void)   
  44. {   
  45.     return PyModule_Create(&lzymodule);   
  46. }  

之後進行編譯

  1. gcc lzymodule.c -shared -I /usr/local/include/python3.2m/ -o lzy.so -fPIC  

最後進入python,試試

  1. import lzy   
  2. lzy.func(1230)  

注,不願意gcc的話,試試這個腳本 見 http://www.linuxidc.com/Linux/2012-02/55038.htm

  1. from distutils.core import setup, Extension   
  2. test_mod = Extension('lzy', sources = ['lzymodule.c'])   
  3. setup(name = 'lzy',   
  4.     version = '1.0',   
  5.     description = 'lzy test extension module',   
  6.     ext_modules = [test_mod])  

 

  1. python setup.py build   
  2. python setup.py install  
Copyright © Linux教程網 All Rights Reserved