python自动控制程序_巧用 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_callback=NULL;staticPyObject*_set_callback(PyObject*self, PyObject*args)
{
PyObject*result=NULL;
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_callback=temp;/*Remember new callback*//*Boilerplate to return "None"*/Py_INCREF(Py_None);
result=Py_None;
}returnresult;
}staticint_compare(constchar*a,constchar*b)
{longret;
PyObject*arglist;
PyObject*result=NULL;
arglist=Py_BuildValue("(ss)", a, b);
result=PyEval_CallObject(my_callback, arglist);
ret=PyInt_AsLong(result);if(result==NULL)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*a=NULL,*b=NULL;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
module1=Extension('ext',
sources=['ext.c'])
setup (name='ext',
version='1.0',
description='This is a demo package',
ext_modules=[module1])
執行過程:
$ python
Python2.6.6(r266:84292, Sep152010,15:52:39)
[GCC4.4.5] on linux2
Type"help","copyright","credits"or"license"formore information.>>>importext>>>defcompare(a, b):
...if(a>b):
...return-1...if(a
...return1...if(a==b):
...return0
...>>>setcmp(compare)
Traceback (most recent call last):
File"", line1,inNameError: name'setcmp'isnotdefined>>>ext.setcmp(compare)>>>ext.compare("aaa","bbb")
arg1isgreater than arg2>>>
上述執行過程中,我們利用了 pythoon 的 compare函數,該函數實現字符串的比較,如果 a > b, 返回 -1,a < b, 返回1, a == b, 返回0, 這和我們平常的比較方式相反,所以最后的結果中我們可以看到比較 "aaa", "bbb" 時,"aaa" 會比 “bbb” 大。
如果使用 python 定義我們常規的字母排序的比較函數,會看到如下執行結果:
>>>defcompare_ex(a, b):
...if(a>b):
...return1...if(a
...return-1...if(a==b):
...return0
...>>>ext.setcmp(compare_ex)>>>ext.compare("aaa","bbb")
arg1isNOT greater than arg2
此時,"aaa" 就比 "bbb" 小。
結論,以上只是一個小小的嘗試,python的靈活性遠遠不止如此,Haippy會繼續探索 python的一些有趣的特性和使用方法,請關注本博客后續文章。:-)
總結
以上是生活随笔為你收集整理的python自动控制程序_巧用 python 脚本控制你的C程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STL10-deque容器
- 下一篇: python编程学习做什么-什么样的人要