终止进程后读取标准输出

时间:2018-09-11 07:56:09

标签: python subprocess

我想启动一个进程,让它运行一段时间,然后读取其输出(最后一个输出正常,我不需要所有内容)。我尝试使用以下代码:

def connect(interface):
    proc = subprocess.Popen(['mycommand', interface], stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
    time.sleep(10)
    proc.terminate()
    output, err = proc.communicate()
    print(output)

不幸的是,每次读取输出时卡住。我还尝试使用proc.read()而不是communicate(),但是并不能解决问题。

在这种情况下处理输出的最佳方法是什么?

非常感谢!

1 个答案:

答案 0 :(得分:0)

经过研究,我发现问题出在缓冲区。如子流程模块文档中所述:

  

在使用stdout = PIPE或stderr = PIPE时,这将导致死锁   进程向管道生成足够的输出,从而阻止等待   OS管道缓冲区接受更多数据。使用Popen.communicate()   使用管道来避免这种情况时。

有两种解决方案:

  • 使用bufsize参数将缓冲区设置为足够大的大小,以存储您在等待期间生成的所有输出。
  • 使用readline()读取输出并在等待时间内刷新缓冲区。如果不需要,则丢弃输出。

我选择第二种方法;我的代码如下:

def connect(interface):
    stdout = []
    timeout = 60
    start_time = time.time()
    proc = subprocess.Popen(['mycommand', interface], stdout=subprocess.PIPE, stderr=subprocess.PIPE, bufsize=1, universal_newlines=True)
    while time.time() < start_time + timeout:
        line = proc.stdout.readline()
        stdout.append(line)
    proc.terminate()
    print(output)