我有一些执行外部应用程序的 Python 代码,当应用程序的输出量很少时,它可以正常工作,但在输出量很大时会挂起。我的代码如下所示:
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
errcode = p.wait()
retval = p.stdout.read()
errmess = p.stderr.read()
if errcode:
log.error('cmd failed <%s>: %s' % (errcode,errmess))
文档中有一些评论似乎表明了潜在的问题。在等待中,有:
警告:如果子进程生成足够多的输出到 a
stdout
orstderr
管道,从而阻塞等待 OS 管道缓冲区接受更多数据,这将死锁。用来communicate()
避免这种情况。
虽然在沟通中,我看到:
注意 读取的数据是缓存在内存中的,所以如果数据量很大或没有限制,请不要使用此方法。
所以我不清楚如果我有大量数据,我应该使用其中任何一个。他们没有说明在这种情况下我应该使用什么方法。
我确实需要 exec 的返回值,并解析和使用stdout
and stderr
。
那么,在 Python 中执行具有大量输出的外部应用程序的等效方法是什么?