我想启动一个进程,让它运行一段时间,然后读取其输出(最后一个输出正常,我不需要所有内容)。我尝试使用以下代码:
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()
,但是并不能解决问题。
在这种情况下处理输出的最佳方法是什么?
非常感谢!
答案 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)