C语言扩展Python(一)

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



你可能感兴趣的:(python调用c,C语言扩展Python)