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]
Как это исправить?
- как вызвать программу из python, не дожидаясь ее возвращения
- Подпроцесс Python: потоковая передача и выход
- Как вызвать ssh по модулю подпроцесса, чтобы он использовал переменную SSH_ASKPASS
- Как запускать команды на оболочке через python
- Использование подпроцесса Python для вывода вывода в новом окне Xterm
Фактически в этом случае вы можете:
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
.
- Интерактивная запись / чтение из внешней программы
- Программа Python зависает вечно, когда вызывается из подпроцесса
- Подпроцесс Python зависает
- Параллельный Python (pp) и подпроцесс: задача никогда не заканчивается на клиенте
- subprocess.call () не ждет
- subprocess.call в Windows не запускает второй файл
- Является ли потоком не-демона Python несвязанным потоком? Когда его ресурс освобождается?
- Убейте цепочку подпроцессов на KeyboardInterrupt
- Введите команды python в командной строке python