python Popen卡死问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python Popen卡死问题相关的知识,希望对你有一定的参考价值。
程序经常卡死,定位了半天才定位到原因,原来是Popen导致的卡死;
程序如下:
s = subprocess.Popen([*,*,*], stdout=subprocess.PIPE)
ret = s.stdout.read()
return ret
官方文档的解释是:
This will deadlock when using stdout=PIPE
and/or stderr=PIPE
and the child process generates enough output to a pipe such that it blocks waiting for the OS pipe buffer to accept more data. Use communicate()
to avoid that.
原因是使用Popen.
wait
()后直接读PIPE.stdout.read()之前,可能缓存已经满了,此时导致了卡死。
解决办法:使用communicate()
例如:
s = subprocess.Popen([*,*,*], stdout=subprocess.PIPE)
stdoutdata, stderrdata = s.communicate()
return stdoutdata
此外,最后在调用Popen的时候加上参数close_fds=True,参见官方文档说明:
popen2 closes all file descriptors by default, but you have to specify close_fds=True with Popen
以后使用Popen还是小心点,这里面坑很多。
以上是关于python Popen卡死问题的主要内容,如果未能解决你的问题,请参考以下文章
在 django 视图中使用 subprocess.Popen() 执行 python 脚本