У меня есть код Python, который выполняет внешнее приложение, которое отлично работает, когда приложение имеет небольшой объем вывода, но зависает, когда есть много. Мой код выглядит так:Использование subprocess.Popen для процесса с большим выходом
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))
В документах есть комментарии, которые, как представляется, указывают на потенциальную проблему. Под засаде, есть:
Предупреждение: Это тупик, если дочерний процесс генерирует достаточно вывод на
stdout
илиstderr
трубы таким образом, что он блокирует ожидание буфера трубы OS принять больше данных. Используйтеcommunicate()
, чтобы этого избежать.
хотя при общении, я вижу:
Примечание чтения данных в буфер в памяти, поэтому не используйте этот метод, если размер данных является большим или неограниченным.
Так что мне непонятно, что я должен использовать любой из них, если у меня есть большой объем данных. Они не указывают, какой метод я должен использовать в этом случае.
Мне нужно вернуть значение из exec и выполнить разбор и использовать как stdout
, так и stderr
.
Итак, что такое эквивалентный метод в Python для выполнения внешнего приложения, которое будет иметь большой выход?
кажется «большой» в сообщаться документация * гораздо больше *, чем вы, вероятно, ожидали, и безусловно, намного больше обычного. Например, вы можете вывести 10 МБ текста, и большинство систем будет в порядке с общением. Выход 1 ГБ, когда у вас всего 1 ГБ ОЗУ, будет другой историей. – 2010-02-26 04:29:01