Привет У меня есть следующий код в Python 2.6:Чтение из трубы в питона imposiible
command = "tcpflow -c -i any port 5559"
port_sniffer = subprocess.Popen(command, stdout=subprocess.PIPE, bufsize=1, shell=True)
while True:
line = port_sniffer.stdout.readline()
#do some stuff with line
Цель этого кода, чтобы прослушивать трафик между двумя процессами (А и В), которые взаимодействуют на порту 5559 .
Теперь позвольте мне описать различные сценарии, я имею:
1) Код выше не работает: а и в общении и я могу видеть это ясно с помощью журналов и команды Линукс netstat -napl | grep 5559
показывает, что пр ocesses общаются на нужном порту.
2) Код выше не работает, и я нюхаю, запустив tcpflow -c -i any port 5559
прямо из оболочки: Я вижу сообщение на консоли ясно :-).
3) Выполняется код выше: Пропуск не может связываться. netstat -napl | grep 5559
ничего не печатает, а журналы выдают ошибки !!!
4) Код выше работает в режиме отладки: Я не могу быть в состоянии уйти после того, как линии line = port_sniffer.stdout.readline()
Я попытался с помощью итератора вместо цикла While (не то, что это имеет значение, но все-таки Я указываю это). Я также пробовал разные значения для bufsize (нет, 1 и 8).
Пожалуйста, помогите!
tcpflow не стандартная программа. Можете ли вы рассказать о том, что делает 'tcpflow -c -i любой порт 5559'? Оставляет ли он данные только в файл или выводит информацию в stdout/stderr? – FuriousGeorge
О, и FWIW http://stackoverflow.com/questions/3172470/actual-meaning-of-shell-true-in-subprocess – FuriousGeorge
tcpflow захватывает tcp-пакеты и записывает их тело сообщения (без накладных расходов tcp) в файлы или консоль. Флаг -c заставляет его записывать свой вывод на консоль. Я предпочел бы использовать shell = True, потому что я не знаю, какая другая среда может запустить эту программу. – whomaniac