我正在尝试使用管道进行两个进程通信。 我在父进程中这样做了:
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之后。 这表明父进程在终止执行后才获取子进程的输出。
我想知道在程序结束之前是否可以获得输入。 我的想法是通过这个管道传递信息,获取输入,处理它,并在管道中输出结果,以便另一个可以继续处理。
有任何帮助吗? 谢谢,
曼努埃尔
答案 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.readline
和sys.stdout.write
作为风格问题。
我写了2 test programs,他们在Fedora 13上使用python-2.6.4-27工作得很好。
答案 2 :(得分:0)
您必须使用select。就像在子进程的通信方法中一样。 在python issue tracker中对此进行了讨论。
答案 3 :(得分:0)