[Python Subprocess Popen 管道阻塞问题分析解决]
使用subprocess库时可以用wait来等待命令执行完成。但是在获取结果时,可能会阻塞住,例如
def read():
p = subprocess.Popen(["cat", "test.txt"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p.wait()
return p.stdout
当test.txt大于64k时,会阻塞住。原因是,子进程产生一些数据,他们会被buffer起来,当buffer满了,会写到子进程的标准输出和标准错误输出,这些东西通过管道发送给父进程。当管道满了之后,子进程就停止写入,于是就卡住了。
解决办法
- 在wait前,读取管道,这样管道就不会满
def read():
p = subprocess.Popen(["cat", "test.txt"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
for line in p.stdout.readline():
print line
p.stdout.close()
p.wait()
return
- 使用communicate
def read():
p = subprocess.Popen(["cat", "test.txt"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p.communicate()
return p.stdout
这样输出会被缓存到内存里,而不是管道中,没有容量限制。但是要保证内存够用。
网友评论