Python具有很好的开发灵活性,最大的特点是C语言可以对Python进行扩展,目前工作中正在进行相关的开发,第一篇文章作为基础.
实现C函数,用Python API封装,实现俩个功能,1.say_hello,打印hello world! 2.calc_pv,做加法用算.
以下为使用方法:
Python 2.7.3 (default, Nov 13 2012, 11:17:50) [GCC 4.1.2 20080704 (Red Hat 4.1.2-48)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> >>> import session >>> >>> session.sayhello() hello world! >>> session.sum(1,2) 3 >>>以下为实现的步骤,核心的地方在代码里加了注释.
/** * * $ cpython_eg1.c version1.0 2012-11-13 xxx $ * @2012 xxx.com.cn * */ #include "Python.h" static PyObject *say_hello(PyObject *self) { printf("%s\n","hello world!"); /** python 没有void 类型,在没有返回值的时候,必须使用Py_RETURN_NONE*/ Py_RETURN_NONE; } static PyObject *calc_pv(PyObject *self,PyObject *args) { int i_ct=0; int j_ct=0; /** PyArg_ParseTuple 用来解析参数,PyArg_ParseTuple \ (PyObject *args, const char *format, ...)*/ /** i代表int,同理s代表char *,d代表double,多个参数可以直接使用'is'这样使用,'|'代表或的意思, 代码中'|'最后一个i是可选参数*/ if (! PyArg_ParseTuple(args, "i|i", &i_ct,&j_ct)) return NULL; return Py_BuildValue("i", (i_ct+j_ct)); } /* * Function table * PyMethodDef结构体定义: * struct PyMethodDef { * const char *ml_name; // The name of the built-in function/method * PyCFunction ml_meth; // The C function that implements it * int ml_flags; // Combination of METH_xxx flags, which mostly * describe the args expected by the C func * const char *ml_doc; // The __doc__ attribute, or NULL * }; * */ static PyMethodDef addMethods[] = { // METH_NOARGS 无参数 {"sayhello",(PyCFunction)say_hello,METH_NOARGS,"say hello!"}, // METH_VARARGS 带有参数 {"sum",(PyCFunction)calc_pv,METH_VARARGS,"calc pv"}, /**NULL代表结束位,Py_InitModule会以NULL代表函数列表结束*/ {NULL, NULL, 0, NULL} }; /* * Initialize * * 如果定义模块名字为session,必须要有initsession(void)函数作为动态接口 * Python会自动寻找接口调用 */ PyMODINIT_FUNC initsession(void) { PyObject *module; /** Initialize module ,addMethods是需要初始化的函数列表*/ module = Py_InitModule("session", addMethods); if (!module) return; }
最后是编译的过程,首先创建setup.py,内容如下
from distutils.core import setup, Extension module1 = Extension('session',sources=['cpython_eg1.c'],language='c') setup (name = 'emar_py_lib', version = '1.0', \ description = 'This is a demo package', \ ext_modules = [module1])编译过程为:
1.python setup.py build
2.sudo python setup.py install