У меня есть код 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))
В документах есть комментарии, которые, как представляется, указывают на потенциальную проблему. В ожидании есть:
Предупреждение. Это будет заторможен, если дочерний процесс генерирует достаточный вывод в канал
stdout
илиstderr
, так что он блокирует ожидание того, что буфер буфера ОС будет принимать больше данных. Используйтеcommunicate()
, чтобы избежать этого.
хотя я общаюсь, я вижу:
Примечание. Чтение данных буферизуется в памяти, поэтому не используйте этот метод, если размер данных является большим или неограниченным.
Поэтому мне непонятно, что я должен использовать любой из них, если у меня есть большой объем данных. Они не указывают, какой метод я должен использовать в этом случае.
Мне нужно вернуть значение из exec и выполнить синтаксический анализ и использовать как stdout
, так и stderr
.
Итак, что такое эквивалентный метод в Python для выполнения внешнего приложения, которое будет иметь большой выход?