这几天做了一点事情,略微有些收获,跟大家分享一下
Python大家应该比较熟悉,很好的一门语言,最近几年一直很流行,尤其是在外企,比较有名的IT公司几乎毫无例外的都使用python,像Intel, Marvell, Cisco, EMC等等。
我也认为这门语言很优秀,首先是语法简单,学起来很快,如果有c++经验的话几天就上手了,
其次是开源,那就意味着你可以再遵循GPL的条件下随意分发和使用。
还有就是维护起来容易,据统计Python代码比其他代码维护成本至少要少一半
好了,不说废话了,记得有次参加Ubuntu的发布会,有位大牛说过一句话“人生苦短,请用Python”
但是一些比较底层的东西Python是无能为力的,比如说Linux下的文件系统啊,设备驱动啊等等,跟C比起来效率还是差一截,毕竟这个世上没有万能的工具,
但是我们可以将这几个工具组合以发挥他们最大的威力,靠近底层的,效率要求比较高的我们用c来实现,c短小精悍,而上层点的比如UI部分我们则可以用Python来实现,
然后用Python来调用c程序,好了,这里就是本文的关键了,怎么让C程序和Python通信呢?
可能上面讲的很多人还不是很明白,上个例子吧
比如我们要操作磁盘设备文件(/dev/sdb1),然后对这个文件进行写,直到将其写满位置,一般这种文件都很大,如果用python来做的话效率势必很低,我们
只有用c来实现,具体的c程序的实现部分比较简单,感兴趣的可以自己做个实验,上层UI部分我们用Python实现。
现在假设我们已经用C程序实现了,并编译生成一个可执行文件,名为“DiskErase”,
我们需要实现的是DiskErase怎么和Python程序通信,以让UI知道当前写了多少字节到/dev/sdb1中,然后更新当前进度条。
在Python中我们很容易通过System("./DiskErase")来实现对DiskErase的调用,但是这样是不能让上层Pthon程序和DiskErase通信的,
有人说Python中有个popen(“./DiskErase"),然后就可以通信了, 不错,这样只能Python程序是可以得到DsikErase的输出(printf之类的东西),
但是Python会等待DiskErase执行完毕才会再继续执行下去,那么我们UI中的进度条怎么可能实时更新了,所以这种方法当然不行。
Python中还有个专门用于进程间通信的模块,名叫subprocess,可以在python程序中将标准输出作为管道,这里的DiskErase输出到标准输出的东西我们都可以通过
读管道来获得,所以可以实时获得DiskErase的输出,更新UI部分的精度条,这样就实现了C程序和Python的进程间通信,下面是Python程序的部分关键源码:
## This funciton is to excute the cmd in order to fork a new process by subprocess.Popen ###
def excute_cmd(self, cmd = []): //cmd = ['xad_hd', '-s', str(standard), '-g', self.get_disk(widget)] cmd 是一个列表,可以以参数传递过去
percentage = 0 // 列表第一项是C程序的可执行文件,后面的是一些参数
sp = subprocess.Popen(cmd, stdout = subprocess.PIPE, stderr = subprocess.PIPE) //将标准输出和标准错位重定向为管道
while True:
time.sleep(0.5)
sp.send_signal(signal.SIGUSR1) //每0.5秒python程序向c程序发送一次信号, c程序对应的信号处理程序中向标准输出打印想要传递的数据
message = sp.stdout.readline() //读管道
......... //对从管道读到的数据进行处理
上一篇:real time performance test
下一篇:Linux下从信号量看线程调度时间