【发布时间】:2010-11-13 21:58:18
【问题描述】:
我有一些 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))
文档中的 cmets 似乎表明存在潜在问题。等待中,有:
警告:如果子进程向
stdout或stderr管道生成足够的输出,从而阻塞等待操作系统管道缓冲区接受更多数据,这将导致死锁。使用communicate()来避免这种情况。
虽然在交流中,但我明白了:
注意读取的数据是缓存在内存中的,所以如果数据量很大或者没有限制,不要使用这种方法。
所以我不清楚如果我有大量数据,我应该使用其中任何一个。他们没有说明在这种情况下我应该使用什么方法。
我确实需要 exec 的返回值,并解析和使用 stdout 和 stderr。
那么,在 Python 中,执行具有大量输出的外部应用程序的等效方法是什么?
【问题讨论】:
-
通信文档中的“大”似乎比您预期的要大得多,而且肯定比一般情况大得多。例如,您可以输出 10MB 的文本,大多数系统都可以进行通信。当您只有 1GB 的 RAM 时输出 1GB 将是另一回事。
标签: python subprocess