python 内置模块 增加_给python增加IPC模块

前天介绍了linux进程间通信──消息队列,由于消息队列是linux内核提供的功能,所以理所当然地,C语言用起来最为方便:直接include一个sys/msg.h就可以了,所以之前的文章,我也是用C语言来做演示的.

那么我喜欢的Python能不能用IPC呢?能不能像C一样用消息队列呢?

其实,Python的内置模块里,并没有对IPC的支持,但是好在python的可扩展性超强,我们可以用swig来为python增加一个IPC模块.方法如下:

下载这个tar包(修改自这里),解压到任意目录,得到 ipc.h ipc.i Makefile 3个文件,如果你不是用的python2.6,需要修改一下 Makefile 里的路径(python3系列未测试).然后

make && make install

make && make install

这样,你就可以在python里 import ipc模块了.

还是贴示例代码,保存为ipc_msg.py,并加可执行权限:

#!/usr/bin/env python

import sys,ipc

if len(sys.argv)==5 and sys.argv[3][0]=='s':

ipc_key=int(sys.argv[1])

msg_id = ipc.msgget(ipc_key,0666|ipc.IPC_CREAT)

if 0 > msg_id:

sys.exit(1)

mbuf = ipc.msgbuf()

mbuf.mtype = int(sys.argv[2])

mbuf.mtext = sys.argv[4]

if 0 > ipc.msgsnd(msg_id,mbuf,len(mbuf.mtext),0):

sys.exit(3)

print 'Send Success.'

elif len(sys.argv)==4 and sys.argv[3][0]=='r':

ipc_key=int(sys.argv[1])

mbuf = ipc.msgbuf()

msg_id = ipc.msgget(ipc_key,0666)

if 0 > msg_id:

sys.exit(1)

msg_len=ipc.msgrcv(msg_id,mbuf,2048,int(sys.argv[2]),ipc.IPC_NOWAIT)

if 0 > msg_len:

print 'No message received.'

sys.exit(3)

else:

print 'Recv Success.(%d bytes):'% msg_len

print mbuf.mtext

elif len(sys.argv)==3 and sys.argv[2][0]=='c':

ipc_key=int(sys.argv[1])

id_dsp = ipc.msqid_ds()

msg_id = ipc.msgget(ipc_key,0666)

if 0 > msg_id:

sys.exit(1)

if 0 > ipc.msgctl(msg_id,ipc.IPC_RMID,id_dsp):

sys.exit(2)

else:

print "usage: \n%s key type s message --to send message\n\

%s key type r --to receive\n\

%s key c --to clear queue"\

%(sys.argv[0],sys.argv[0],sys.argv[0])

#!/usr/bin/env python

import sys,ipc

if len(sys.argv)==5 and sys.argv[3][0]=='s':

ipc_key=int(sys.argv[1])

msg_id = ipc.msgget(ipc_key,0666|ipc.IPC_CREAT)

if 0 > msg_id:

sys.exit(1)

mbuf = ipc.msgbuf()

mbuf.mtype = int(sys.argv[2])

mbuf.mtext = sys.argv[4]

if 0 > ipc.msgsnd(msg_id,mbuf,len(mbuf.mtext),0):

sys.exit(3)

print 'Send Success.'

elif len(sys.argv)==4 and sys.argv[3][0]=='r':

ipc_key=int(sys.argv[1])

mbuf = ipc.msgbuf()

msg_id = ipc.msgget(ipc_key,0666)

if 0 > msg_id:

sys.exit(1)

msg_len=ipc.msgrcv(msg_id,mbuf,2048,int(sys.argv[2]),ipc.IPC_NOWAIT)

if 0 > msg_len:

print 'No message received.'

sys.exit(3)

else:

print 'Recv Success.(%d bytes):'% msg_len

print mbuf.mtext

elif len(sys.argv)==3 and sys.argv[2][0]=='c':

ipc_key=int(sys.argv[1])

id_dsp = ipc.msqid_ds()

msg_id = ipc.msgget(ipc_key,0666)

if 0 > msg_id:

sys.exit(1)

if 0 > ipc.msgctl(msg_id,ipc.IPC_RMID,id_dsp):

sys.exit(2)

else:

print "usage: \n%s key type s message --to send message\n\

%s key type r --to receive\n\

%s key c --to clear queue"\

%(sys.argv[0],sys.argv[0],sys.argv[0])

运行结果:

lily@LLY:~/test/ipc$ ipcs -q

------ Message Queues --------

key msqid owner perms used-bytes messages

lily@LLY:~/test/ipc$ ./ipc_msg.py 1 2 s abc

Send Success.

lily@LLY:~/test/ipc$ ipcs -q

------ Message Queues --------

key msqid owner perms used-bytes messages

0x00000001 65536 lily 666 3 1

lily@LLY:~/test/ipc$ ./ipc_msg.py 1 2 r

Recv Success.(3 bytes):

abc

lily@LLY:~/test/ipc$ ipcs -q

------ Message Queues --------

key msqid owner perms used-bytes messages

0x00000001 65536 lily 666 0 0

lily@LLY:~/test/ipc$ ./ipc_msg.py 1 c

lily@LLY:~/test/ipc$ ipcs -q

------ Message Queues --------

key msqid owner perms used-bytes messages

lily@LLY:~/test/ipc$

lily@LLY:~/test/ipc$ ipcs -q

------ Message Queues --------

key msqid owner perms used-bytes messages

lily@LLY:~/test/ipc$ ./ipc_msg.py 1 2 s abc

Send Success.

lily@LLY:~/test/ipc$ ipcs -q

------ Message Queues --------

key msqid owner perms used-bytes messages

0x00000001 65536 lily 666 3 1

lily@LLY:~/test/ipc$ ./ipc_msg.py 1 2 r

Recv Success.(3 bytes):

abc

lily@LLY:~/test/ipc$ ipcs -q

------ Message Queues --------

key msqid owner perms used-bytes messages

0x00000001 65536 lily 666 0 0

lily@LLY:~/test/ipc$ ./ipc_msg.py 1 c

lily@LLY:~/test/ipc$ ipcs -q

------ Message Queues --------

key msqid owner perms used-bytes messages

lily@LLY:~/test/ipc$

怎么样?和之前的C语言版本一模一样吧?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值