Linux下Python与C程序进程间通信

转自:kevin1985.blog.chinaunix.net


这几天做了一点事情,略微有些收获,跟大家分享一下

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()            //读管道
.........                                             //对从管道读到的数据进行处理




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值