C语言扩展Python(二)

上次实践的是在工作中写的小程序,也是Python扩展的基础,在上一个例子C语言扩展Python(一)中其实核心在于对Python参数的解析,Python.org提供了很丰富的解析规则,几乎任何类型(基础类型、对象类型等).推荐官网链接说明:
http://docs.python.org/2/c-api/arg.html.

Python编写中,经常用到关键词参数传递,例如:

def fun(arg0,arg1=None,arg2=None):
    print "%s %s %s" % (arg0,arg1,arg2)

def main():
    fun('hello',arg2='!',arg1='world')

if __name__ == '__main__':
    main()
输出:
>> hello world !

C语言扩展也可以实现,参数解析我们使用PyArg_ParseTupleAndKeywords方法做解析.该方法定义的原型为:

/* Support for keyword arguments donated by
   Geoff Philbrick <[email protected]> */

/* Return false (0) for error, else true. */
int
PyArg_ParseTupleAndKeywords(PyObject *args,
                            PyObject *keywords,
                            const char *format,
                            char **kwlist, ...)
下面是在例子 C语言扩展Python(一) 基础上增加,实现一个关键词参数传递的方法.
/**
 * python中经常会使用关键词参数
 * 例如:
 *     def func(a,arg1='hello') ...
 * C扩展也可以实现该形式的调用,只是使用不一样的解析参数函数
 */
static PyObject *print_kw(PyObject *self,PyObject *args,PyObject *kw)
{
	static char *kwlist[] = { "arg0","arg1",NULL};
	char* hello="default";
	char* world="default";
	if (!PyArg_ParseTupleAndKeywords(args,kw,"s|s",kwlist,&hello,&world)) {
		 printf("ERROR");
		 return NULL;
	}
	printf("%s %s\n",hello,world);
	Py_RETURN_NONE;
}

kwlist[] 定义出我们关键词参数key的名字,不难看出我们定义俩个关键词参数arg0与arg1,接下来就是向Python暴露该方法.
详细参考下方代码段.

static PyMethodDef addMethods[] =
{
	 // METH_NOARGS 无参数
	{"sayhello",(PyCFunction)say_hello,METH_NOARGS,"say hello!"},
	 // METH_VARARGS 带有参数
	{"sum",(PyCFunction)calc_pv,METH_VARARGS,"calc pv"},
	 // METH_VARARGS 带有关键字参数
	{"print_args",(PyCFunction)print_kw,METH_KEYWORDS,"print argument keyword"},
	/**NULL代表结束位,Py_InitModule会以NULL代表函数列表结束*/
	{NULL, NULL, 0, NULL}
};

METH_KEYWORDS代表该方法是关键词参数类型.接着我们按照C语言扩展Python(一)方法重新编译setup.py.并进行测试

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
>>> help(session)
Help on module session:

NAME
    session

FILE
    /usr/local/lib/python2.7/site-packages/session.so

FUNCTIONS
    print_args(...)
        print argument keyword
    
    sayhello(...)
        say hello!
    
    sum(...)
        calc pv


>>> session.print_args('hello')
hello default
>>> session.print_args(arg0='hello')
hello default
>>> session.print_args(arg0='hello',arg1='world!')
hello world!
>>>







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