2016-05-25 4 views
0

Из документации Popen.wait(), я вижуSubprocess висячие на Wait

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

У меня возникли проблемы с пониманием нижеприведенного поведения, поскольку нижеследующий пробег может генерировать довольно большой объем стандартного выхода.

Однако то, что я замечаю, что

subproc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

будет висеть.

Хотя

subproc = subprocess.Popen(command, stdout=subprocess.PIPE)

не будет висеть.

Если command генерирует большое количество стандартного выхода, почему второй оператор не висит, поскольку мы все еще используем stdout=subprocess.PIPE?

ответ

0

Вторая команда не будет висеть, потому что проблема связана не с большим объемом данных на стандартном выходе, а с большим количеством данных стандартной ошибки.

В первом случае стандартная ошибка перенаправляется на стандартный вывод, который передается в вашу программу. Следовательно, большой объем данных, создаваемых при стандартной ошибке, дает эквивалентный результат большому количеству данных, создаваемых на стандартном выходе.

В последнем случае стандартная ошибка подпроцесса перенаправляется на стандартную ошибку вызывающего процесса и, следовательно, не может застревать в трубе.