擅长:python、mysql、java
<p>为了实时地从子流程中获取stdout,您需要准确地决定您想要什么行为;具体地说,您需要决定是逐行处理输出还是逐字处理输出,以及您是希望在等待输出时阻塞还是能够在等待时执行其他操作。</p>
<p>看起来,以行缓冲方式读取输出可能就足够了,阻塞直到每个完整的行进入,这意味着<code>subprocess</code>提供的便利函数足够好:</p>
<pre><code>p = subprocess.Popen(some_cmd, stdout=subprocess.PIPE)
# Grab stdout line by line as it becomes available. This will loop until
# p terminates.
while p.poll() is None:
l = p.stdout.readline() # This blocks until it receives a newline.
print l
# When the subprocess terminates there might be unconsumed output
# that still needs to be processed.
print p.stdout.read()
</code></pre>
<p>如果需要写入进程的stdin,只需使用另一个管道:</p>
<pre><code>p = subprocess.Popen(some_cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE)
# Send input to p.
p.stdin.write("some input\n")
p.stdin.flush()
# Now start grabbing output.
while p.poll() is None:
l = p.stdout.readline()
print l
print p.stdout.read()
</code></pre>
<p>另一个答案是,不需要通过文件间接地将输入传递给子流程。</p>