美文网首页
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