如何在python中读取子进程的流?

时间:2016-09-29 07:59:21

标签: python multithreading subprocess

我使用subprocess.Popen创建了一个流程,并获得了stdout。 我想阅读stdout中的内容并在另一个帖子中打印出来。 由于我的目的是稍后制作一个交互式程序,我不能使用subprocess.communicate

我的基本要求是:一旦子进程输出内容,线程应立即将其打印到屏幕上。

这是代码

import subprocess
import thread
import time

def helper(s):
    print "start",time.gmtime()
    while True:
        print "here"
        print s.next()
    print "finished",time.gmtime()
    thread.start_new_thread(helper,(out_stream,))

def process_main():
    global stdin_main
    global stdout_main
    p = subprocess.Popen("/bin/bash", shell=False, stdin=subprocess.PIPE,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.STDOUT, bufsize=0)
    stdin_main = p.stdin
    stdout_main = p.stdout
    th1 = thread_print_stream(stdout_main)
    stdin_main.write("ls -la\n")
    stdin_main.flush()
    time.sleep(30)

    p.terminate()

process_main()

"开始"之间的时间间隔并且"完成"应该非常快。但是它是30秒,与进程终止前的时间完全相同。 我无法理解为什么输出不是实例。 或者我如何才能实现?

1 个答案:

答案 0 :(得分:0)

正如cdarke所说。该程序遭受缓冲。 但它更像是python 2.x中的一个bug。 当前程序的逻辑没有错。

要解决此问题,您必须重新打开stdout。 像下面的代码:

def thread_print_stream(out_stream):
  def helper(s):
    print "start",time.gmtime()
    for line in io.open(out_stream.fileno()):
      print line
    print "finished",time.gmtime()
  thread.start_new_thread(helper,(out_stream,))

并添加

stdin_main.close()
stdout_main.close()

在子进程终止之前,确保没有错误上升。