<p><a href="https://stackoverflow.com/a/6490489/2039589">select.poll()</a>答案非常简洁,但在Windows上不起作用。下面的解决方案是另一种选择。它不允许您查看stdout,但提供了readline()的非阻塞替代方法,它基于<a href="https://stackoverflow.com/a/883166/2039589">this answer</a>:</p>
<pre><code>from subprocess import Popen, PIPE
from threading import Thread
def process_output(myprocess): #output-consuming thread
nextline = None
buf = ''
while True:
# - extract line using read(1)
out = myprocess.stdout.read(1)
if out == '' and myprocess.poll() != None: break
if out != '':
buf += out
if out == '\n':
nextline = buf
buf = ''
if not nextline: continue
line = nextline
nextline = None
# - do whatever you want with line here
print 'Line is:', line
myprocess.stdout.close()
myprocess = Popen('myprogram.exe', stdout=PIPE) #output-producing process
p1 = Thread(target=process_output, args=(dcmpid,)) #output-consuming thread
p1.daemon = True
p1.start()
# - do whatever here and then kill process and thread if needed
if myprocess.poll() == None: #kill process; will automatically stop thread
myprocess.kill()
myprocess.wait()
if p1 and p1.is_alive(): #wait for thread to finish
p1.join()
</code></pre>
<p>其他非阻塞读取的解决方案已经被提出<a href="https://stackoverflow.com/q/375427/2039589">here</a>,但对我来说并不管用:</p>
<ol>
<li>需要readline的解决方案(包括基于队列的解决方案)总是阻塞。这很难(不可能?)终止执行readline的线程。它只会在创建它的进程结束时被终止,而不会在输出生成过程被终止时终止。在</li>
<li>正如anonnn指出的那样,混合使用低级fcntl和高级readline调用可能无法正常工作。在</li>
<li>使用选择投票()很简洁,但根据python文档,它不适用于Windows。在</li>
<li>使用第三方库对于这个任务来说似乎有些过分,并且增加了额外的依赖性。在</li>
</ol>