Как я могу узнать, почему 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 и не имеет какого-либо пользовательского ввода (т.е. "Нажмите клавишу" ).
Ответы
Ответ 1
Когда буфер буфера заполняется (обычно 4 КБ или около того), процесс записи останавливается до тех пор, пока процесс чтения не прочитает некоторые данные, о которых идет речь; но здесь вы ничего не читаете до тех пор, пока не будет выполнен подпроцесс, а значит, тупик. Документы на wait
выразились очень четко:
Предупреждение. Это будет заторможен, если дочерний процесс генерирует достаточную производительность к трубе stdout или stderr, так что он блокирует ожидание протокола OS буфер, чтобы принимать больше данных. использование обмениваться(), чтобы избежать этого.
Если вы не можете использовать communicate
по какой-либо причине, попросите подпроцесс записать во временный файл, а затем вы можете wait
и прочитать этот файл, когда он готов - запись в файл, а не в труба, не подвергает риску тупик.
Ответ 2
Посмотрите docs. В нем указано, что вы не должны использовать wait, так как это может привести к блокировке. Попробуйте использовать communicate.