美文网首页
Subprocess Popen 管道阻塞问题

Subprocess Popen 管道阻塞问题

作者: 高稚商de菌 | 来源:发表于2019-07-15 12:03 被阅读0次

[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满了,会写到子进程的标准输出和标准错误输出,这些东西通过管道发送给父进程。当管道满了之后,子进程就停止写入,于是就卡住了。
解决办法

  1. 在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
  1. 使用communicate
def read():
    p = subprocess.Popen(["cat", "test.txt"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    p.communicate()
    return p.stdout

这样输出会被缓存到内存里,而不是管道中,没有容量限制。但是要保证内存够用。

相关文章

网友评论

      本文标题:Subprocess Popen 管道阻塞问题

      本文链接:https://www.haomeiwen.com/subject/jjtnkctx.html