今天在用subprocess去执行问一个python脚本的时候,由于python脚本输出的内容很多,而subprocess的pipe的大小是有限制的,如果pipe的内容过多,将阻塞等待被读取,此时如果我使用wait()等待的话,将一直导致父进程阻塞,
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
p.wait()
stdout, stderror = p.communicate()
Popen.wait() 等待子进程结束,设置并返回 returncode 属性。 注意:如果子进程输出了大量数据到stdout或者stderr的管道,并达到了系统 pipe的缓存大小的话,子进程会等待父进程读取管道,而父进程此时正wait着的话,将会产生传说中的死锁,后果是非常严重滴。建议使用communicate()来 避免这种情况的发生。 Popen.communicate(input=None) 和子进程交互:发送数据到stdin,并从stdout和stderr读数据,直到收到EOF。等待子进程结束。可选的input如有 有的话,要为字符串类型。 此函数返回一个元组: (stdoutdata, stderrdata) 。 注意,要给子进程的stdin发送数据,则Popen的时候,stdin要为PIPE;同理,要可以收数据的话,stdout或者stderr也要为 PIPE。 注意:读到的数据会被缓存在内存里,所以数据量非常大的时候要小心了。