<p>问题是<code>pipe</code>已满。子进程停止,等待管道清空,但随后您的进程(Python解释器)退出,中断其管道末端(因此出现错误消息)。</p>
<p><code>p.wait()</code>不会帮助您:</p>
<blockquote>
<p><strong>Warning</strong> This will deadlock if the child process generates enough output to a stdout or stderr pipe such that it blocks waiting for the OS pipe buffer to accept more data. Use <code>communicate()</code> to avoid that.</p>
<p><a href="http://docs.python.org/library/subprocess.html#subprocess.Popen.wait" rel="noreferrer">http://docs.python.org/library/subprocess.html#subprocess.Popen.wait</a></p>
</blockquote>
<p><code>p.communicate()</code>不会帮助您:</p>
<blockquote>
<p><strong>Note</strong> The data read is buffered in memory, so do not use this method if the data size is large or unlimited.</p>
<p><a href="http://docs.python.org/library/subprocess.html#subprocess.Popen.communicate" rel="noreferrer">http://docs.python.org/library/subprocess.html#subprocess.Popen.communicate</a></p>
</blockquote>
<p><code>p.stdout.read(num_bytes)</code>不会帮助您:</p>
<blockquote>
<p><strong>Warning</strong> Use <code>communicate()</code> rather than <code>.stdin.write</code>, <code>.stdout.read</code> or <code>.stderr.read</code> to avoid deadlocks due to any of the other OS pipe buffers filling up and blocking the child process.</p>
<p><a href="http://docs.python.org/library/subprocess.html#subprocess.Popen.stdout" rel="noreferrer">http://docs.python.org/library/subprocess.html#subprocess.Popen.stdout</a></p>
</blockquote>
<p>这个故事的寓意是,对于大输出来说,<code>subprocess.PIPE</code>如果您的程序试图读取数据,那么它将注定失败(在我看来,您应该能够将<code>p.stdout.read(bytes)</code>放入一个<code>while p.returncode is None:</code>循环中,但上面的警告表明这可能会死锁)。</p>
<p>文档建议用以下内容替换shell管道:</p>
<pre><code>p1 = Popen(["zgrep", "thingiwant", "largefile"], stdout=PIPE)
p2 = Popen(["processreceivingdata"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]
</code></pre>
<p>注意,<code>p2</code>直接从<code>p1</code>获取其标准输入。这应该可以避免死锁,但是考虑到上面相互矛盾的警告,<em>谁知道</em>。</p>
<p>无论如何,如果最后一部分对您不起作用(但是它应该<em>应该</em>),您可以尝试创建一个临时文件,将第一次调用中的所有数据写入该文件,然后将该临时文件用作下一个进程的输入。</p>