Python grep и труба через Popen

Я пытаюсь grep из каталога и ограничиваю поиск до первых 100 результатов. Следующий код продолжает уступать

[..] grep: writing output: Broken pipe grep: writing output: Broken pipe grep: writing output: Broken pipe grep: writing output: Broken pipe [..] 

Код:

 p_grep = Popen(['/bin/bash', '-c', 'grep -F "asdasdasd" data/*'], stdout = PIPE) p_head = Popen(['head', '-100'], stdin = p_grep.stdout, stdout = PIPE) output = p_head.communicate()[0] 

Как это исправить?

Фактически в этом случае вы можете:

 output = check_output(['/bin/bash', '-c', 'grep -F "asdasdasd" data/* | head -100']) 

Согласно документации Popen по написанию труб, вы должны обязательно закрыть stdout на поточных процессах (в данном случае p_grep ), чтобы они могли получать SIGPIPE из процессов с p_head (в данном случае p_head ).

Кроме того, согласно этому сообщению , важно обеспечить функцию настройки для каждого подпроцесса, чтобы обработка Python SIGPIPE была восстановлена ​​по умолчанию.

Таким образом, код становится:

 def preexec_fn(): import signal signal.signal(signal.SIGPIPE, signal.SIG_DFL) p_grep = Popen(['/bin/bash', '-c', 'grep -F "asdasdasd" data/*'], stdout=PIPE, preexec_fn=preexec_fn) p_head = Popen(['head', '-100'], stdin=p_grep.stdout, stdout=PIPE, preexec_fn=preexec_fn) p_grep.stdout.close() output = p_head.communicate()[0] 

Это должно привести к тому, что процесс grep завершится после завершения head .