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的话,试试这个脚本 见

  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  

相关内容