Согласно документации Popen о написании каналов вы должны обязательно закрыть stdout
на конвейерных процессах (в данном случае p_grep
), чтобы они могли получать SIGPIPE
от переданных по конвейеру процессов (в данном случае 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
.