平谷手机网站建设,月夜直播免费完整版观看,网站建设题目以及答案,安卓app公司开发python是一门艺术语言#xff0c;除了开发桌面程序#xff0c;还能够开发网络应用#xff0c;数据库应用#xff0c;还可以代替shell编写一些的实用脚本#xff0c;本文主要讲述了如何利用 python 程序控制你的 C 程序的行为。
作为例子#xff0c;本文将用 python 和 C …python是一门艺术语言除了开发桌面程序还能够开发网络应用数据库应用还可以代替shell编写一些的实用脚本本文主要讲述了如何利用 python 程序控制你的 C 程序的行为。
作为例子本文将用 python 和 C 语言来编写示例代码同时也会顺便介绍一下 利用 C 语言扩展 python的方法最后会给出完整的 C 编写 python 模块的源码。
首先考虑以下应用假设你需要在项目中实现字符串排序比较的功能但是事先并不确定应该如何排序再次假设一下如果某字符串中如果出现了 “aaa”, bbb 这样的子串就将该字符串排在靠后的位置此时如果用 C 语言实现了预定义的排序功能那么万一某天需要改变字符串排序行为就必须重新编写 C 程序的实现并且再次编译项目这样会浪费大量的精力相反如果将字符串排序的功能用 python 代码控制即如何排序由python程序定义这样将大大提高程序的灵活性。
以下就是示例程序程序由 python 脚本和 C 编译的 python 模块组成python 实现字符串比较功能为了简化期间本文只是先两个字符串大小的比较用于说明 python控制程序行为已经足够程序采用回调函数实现完整代码如下
python模块
/**
*
* Filename: ext.c
*
* Description:
*
* Version: 0.1.0
* Created: 09/16/2011 05:44:40 PM
* Revision: r1
* Compiler: gcc
*
* Author: Fu Haiping
* Company: ICT
*
* */#includestaticPyObject*my_callbackNULL;staticPyObject*_set_callback(PyObject*self, PyObject*args)
{
PyObject*resultNULL;
PyObject*temp;if(PyArg_ParseTuple(args,O,temp)) {if(!PyCallable_Check(temp)) {
PyErr_SetString(PyExc_TypeError,parameter must be callable);returnNULL;
}
Py_XINCREF(temp);/*Add a reference to new callback*/Py_XDECREF(my_callback);/*Dispose of previous callback*/my_callbacktemp;/*Remember new callback*//*Boilerplate to return None*/Py_INCREF(Py_None);
resultPy_None;
}returnresult;
}staticint_compare(constchar*a,constchar*b)
{longret;
PyObject*arglist;
PyObject*resultNULL;
arglistPy_BuildValue((ss), a, b);
resultPyEval_CallObject(my_callback, arglist);
retPyInt_AsLong(result);if(resultNULL)return-1;
Py_DECREF(result);returnret;
}voidcompare(constchar*a,constchar*b)
{if(_compare(a, b)0) {
printf(arg1 is greater than arg2\n);
}elseif(_compare(a, b)0) {
printf(arg1 is NOT greater than arg2\n);
}else{
printf(arg1 is equal to arg2\n);
}
}staticPyObject*_compare_callback(PyObject*self, PyObject*args)
{constchar*aNULL,*bNULL;if(!PyArg_ParseTuple(args,ss,a,b)) {returnNULL;
}
compare(a, b);
Py_INCREF(Py_None);returnPy_None;
}staticPyMethodDef
extMethods[]{
{setcmp, _set_callback, METH_VARARGS},
{compare, _compare_callback, METH_VARARGS},
{NULL, NULL}
};voidinitext()
{
Py_InitModule(ext, extMethods);
}
setup.py 文件
fromdistutils.coreimportsetup, Extension
module1Extension(ext,
sources[ext.c])
setup (nameext,
version1.0,
descriptionThis is a demo package,
ext_modules[module1])
执行过程
$ python
Python2.6.6(r266:84292, Sep152010,15:52:39)
[GCC4.4.5] on linux2
Typehelp,copyright,creditsorlicenseformore information.importextdefcompare(a, b):
...if(ab):
...return-1...if(a
...return1...if(ab):
...return0
...setcmp(compare)
Traceback (most recent call last):
File, line1,inNameError: namesetcmpisnotdefinedext.setcmp(compare)ext.compare(aaa,bbb)
arg1isgreater than arg2
上述执行过程中我们利用了 pythoon 的 compare函数该函数实现字符串的比较如果 a b, 返回 -1a b, 返回1, a b, 返回0, 这和我们平常的比较方式相反所以最后的结果中我们可以看到比较 aaa, bbb 时aaa 会比 “bbb” 大。
如果使用 python 定义我们常规的字母排序的比较函数会看到如下执行结果
defcompare_ex(a, b):
...if(ab):
...return1...if(a
...return-1...if(ab):
...return0
...ext.setcmp(compare_ex)ext.compare(aaa,bbb)
arg1isNOT greater than arg2
此时aaa 就比 bbb 小。
结论以上只是一个小小的尝试python的灵活性远远不止如此Haippy会继续探索 python的一些有趣的特性和使用方法请关注本博客后续文章。:-)