Подтвердить что ты не робот

Как я могу узнать, почему subprocess.Popen wait() ждет навсегда, если stdout = PIPE?

У меня есть программа, которая записывает в stdout и, возможно, stderr. Я хочу запустить его из python, захватив stdout и stderr. Мой код выглядит так:

from subprocess import *

p = Popen( exe, shell=TRUE, stdout=PIPE, stderr=PIPE )
rtrncode = p.wait()

Для нескольких программ это прекрасно работает, но когда я добавил новый, новый висит навсегда. Если я удаляю stdout=PIPE, программа записывает свой вывод в консоль и заканчивается, и все в порядке. Как я могу определить, что вызывает зависание?

Использование python 2.5 в Windows XP. Программа не читает от stdin и не имеет какого-либо пользовательского ввода (т.е. "Нажмите клавишу" ).

4b9b3361

Ответ 1

Когда буфер буфера заполняется (обычно 4 КБ или около того), процесс записи останавливается до тех пор, пока процесс чтения не прочитает некоторые данные, о которых идет речь; но здесь вы ничего не читаете до тех пор, пока не будет выполнен подпроцесс, а значит, тупик. Документы на wait выразились очень четко:

Предупреждение. Это будет заторможен, если дочерний процесс генерирует достаточную производительность к трубе stdout или stderr, так что он блокирует ожидание протокола OS буфер, чтобы принимать больше данных. использование обмениваться(), чтобы избежать этого.

Если вы не можете использовать communicate по какой-либо причине, попросите подпроцесс записать во временный файл, а затем вы можете wait и прочитать этот файл, когда он готов - запись в файл, а не в труба, не подвергает риску тупик.

Ответ 2

Посмотрите docs. В нем указано, что вы не должны использовать wait, так как это может привести к блокировке. Попробуйте использовать communicate.