2016-10-09 1 views
0

У меня есть сценарий для скриптов python для журналов, он непрерывно выводит найденные журналы и я хочу использовать linux pipe для фильтрации желаемого вывода. Пример:python Как использовать субпроцессный канал с оболочкой linux

$ python logsearch.py ​​| grep timeout

Проблема заключается в том, что сортировка и wc блокируются до тех пор, пока logsearch.py ​​не завершится, а logsearch.py ​​будет непрерывно выводить результат.

образец logsearch.py:

p = subprocess.Popen("ping google.com", shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE) 
for line in p.stdout: 
    print(line) 

UPDATE:

разобрался, просто изменить стандартный вывод в подпроцесс для sys.stdout, питон будет обрабатывать трубы для вас.

p = subprocess.Popen("ping -c 5 google.com", shell=True, stdout=**sys.stdout**) 

Спасибо за помощь!

+0

'ping -c 5' - нечетный пример скрипта, который работает вечно! Но, да, вы не можете сортировать вещи или подсчитывать количество вещей, пока не получите их всех. – tdelaney

+0

@tdelaney Я удалил счетчик для ping, а вместо сортировки я использую grep, поэтому предположим, что данные должны поступать в конвейер grep через канал, но, похоже, он работает навсегда без печати. –

+0

Вы ничего не получаете, потому что выход не соответствует таймауту. Попробуйте $ python logsearch.py ​​| grep -v timeout –

ответ

0

И зачем использовать grep? Почему бы не сделать все на Python?

from subprocess import Popen, PIPE 
p = Popen(['ping', 'google.com'], shell=False, stdin=PIPE, stdout=PIPE) 

for line in p.stdout: 
    if 'timeout' in line.split(): 
     # Process the error 
     print("Timeout error!!") 
    else: 
     print(line) 

UPDATE:
изменить линию POPEN как рекомендованное @triplee. Плюсы и минусы в Actual meaning of 'shell=True' in subprocess

+0

Причина, по которой требуется grep или другая оболочка cmd, - это добавить гибкость, некоторое время, когда нам захочется добавить grep или sort или awk, чтобы лучше обрабатывать данные. –

+0

ОК. На всякий случай вы можете использовать [Python module sh] (https://pypi.python.org/pypi/sh). Реализует много полезных команд. –

+0

Также используйте 'Popen (['ping', 'google.com'], shell = False, ...)', чтобы избежать появления бесполезной оболочки. – tripleee

 Смежные вопросы

  • Нет связанных вопросов^_^