python3.2上调用C动态链接库
python3.2下调用C动态链接库
python和C,我觉得这简直是无敌的组合啊。一般性的业务逻辑用python快速出模型,而碰到python运行缓慢的操作,则可以通过调用C编译好的链接库来完成。
在python3.2下,可以通过ctype模块单纯的访问C链接库,也可以通过传统方式访问。ctype模块固然方便,但若要求回调的话,还是得用传统方式操作。
今天查阅了官方manual和网上一些链接,感觉有些出处,在这写上一个3.2.2的简单程序:
编辑一个文件lzymodule.c
按官方命名方式,前面是模块名,后面是module.c
之后进行编译
最后进入python,试试
有疑问请跟帖。
注,不愿意gcc的话,试试这个脚本
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的话,试试这个脚本
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