我正在试图与使用python subprocess.Popen()调用的子进程交谈。在我真正的代码中,我正在实现一种IPC,所以我想写一些数据,读取响应,写入更多数据,读取响应等等。正因为如此,我不能使用Popen.communicate(),否则它适用于简单的情况。阅读/写入Popen()子进程
此代码显示我的问题。它甚至从来没有得到第一个反应,挂在第一个“阅读结果”。为什么?我如何能够按照我的预期进行这项工作?
import subprocess
p = subprocess.Popen(["sed", 's/a/x/g'],
stdout = subprocess.PIPE,
stdin = subprocess.PIPE)
p.stdin.write("abc\n")
print "Reading result:"
print p.stdout.readline()
p.stdin.write("cat\n")
print "Reading result:"
print p.stdout.readline()
的确如此!由于某种原因,我的sed使用-u作为“无缓冲”,而不是-l,但它的工作原理完全相同。这解决了我的示例代码,但不幸的是不是我真正的代码,因为实际的命令不是sed,而是另一个python程序。虽然你的回答很好,但你指出了这个问题。 – 2012-04-28 15:39:23
是的,问题解决了。问题是输出缓冲结果。在我的子进程中做一个简单的stdout.flush()解决了这个问题。谢谢! – 2012-04-28 15:51:15