通过管道使python程序“聊天”

时间:2010-07-16 19:55:46

标签: python pipe stdout stdin multiprocessing

我正在尝试使用管道进行两个进程通信。 我在父进程中这样做了:

process = subprocess.Popen(test, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE)

process.stdin.write("4\n");
output = process.stdout.read()
print output

并在子进程中:

inp = raw_input()
integer = int(inp)
print integer**2
while(True):
    pass

我希望父进程打印16 ...不幸的是,它仍然没有打印任何东西。通过睡眠替换无限循环5秒使父进程空闲5秒并且在打印16之后。 这表明父进程在终止执行后才获取子进程的输出。

我想知道在程序结束之前是否可以获得输入。 我的想法是通过这个管道传递信息,获取输入,处理它,并在管道中输出结果,以便另一个可以继续处理。

有任何帮助吗? 谢谢,

曼努埃尔

4 个答案:

答案 0 :(得分:4)

我看到了许多可能的问题:

a)子进程从不实际刷新其输出,因此实际上从未将其输出发送给父进程。

b)父进程在子进程实际发送其输出(刷新其输出)之前运行其read()调用。

c)父进程执行阻塞read(),直到EOF,这实际上意味着它等待子进程退出。 subprocess.Popen文档应该提及是否会出现这种情况。

d)父进程的read()调用在返回之前等待一定数量的字节(例如1024)到达。

可能让父母进行了大量read(1)次呼叫,并在进入时重新组合字节将解决问题。或者使用更高级别的通信API,例如使用数据报而不是解析字节流。

答案 1 :(得分:2)

根据ndim的建议,请在父母的下列内容中进行操作:

process.stdin.write("4\n")    
process.stdin.flush()    
output = process.stdout.readline()    
print output

您还需要更改孩子:

inp = sys.stdin.readline()
integer = int(inp)
sys.stdout.write("%d\n", (integer ** 2,))
sys.stdout.flush()

我使用sys.stdin.readlinesys.stdout.write作为风格问题。

我写了2 test programs,他们在Fedora 13上使用python-2.6.4-27工作得很好。

答案 2 :(得分:0)

您必须使用select。就像在子进程的通信方法中一样。 在python issue tracker中对此进行了讨论。

答案 3 :(得分:0)