Subprocess Popen 管道阻塞问题

[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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 最近在项目中遇到一个需求,前端发来一个命令,这个命令是去执行传递过来的一个脚本(shell 或者python),并...
    llicety阅读 50,232评论 8 19
  • 网络编程 一.楔子 你现在已经学会了写python代码,假如你写了两个python文件a.py和b.py,分别去运...
    go以恒阅读 2,250评论 0 6
  • 处于学习别人代码风格阶段,github参考学习程序程序开头会有 一是用来指定脚本语言为 Python,二是用来指定...
    lifesmily阅读 1,333评论 0 0
  • (1) os.system 这个方法是直接调用标准C的system() 函数,仅仅在一个子终端运行系统命令,而...
    坚持未来阅读 1,667评论 0 2
  • 乡村生活,晚上10点已经是夜深人静,似乎整个村子,只有我家还亮着灯,在学校习惯了晚睡的我,睡不着,拿着手机,拿一把...
    陈福妹1111阅读 369评论 2 2

友情链接更多精彩内容