Найти - Пользователи
Полная версия: Считать построчно вывод из pipe
Начало » Python для экспертов » Считать построчно вывод из pipe
1 2
slivlen
Если ты его используешь тогда не пойму в чем проблема. Отправь ей строку ввода(write()) когда она ее ожидает, а потом считывай ответ.
archy
проблема в том что я не знаю когда она ожидает ввода, точнее когда точно заклончится ее ответ - скажем что-то вывелось я начинаю считывать как только считывание доходит до конца т.е. текст вывода кончается и пытается считать уже пустую строку куда Октавия ожидает ввода то происходит блокировка - решение либо таймаут либо перед считыванием просто вводить свою последовательность символов(типа как признак конца строки) и когда при считывании доходит до нее прекращать считывание - но я думал может есть какой более изящный способ возможно есть штатные средства для такой ситуации
cleg
а под винду есть аналоги expect-а и иже с ним?
yahan
koder
1)Под какой ОС ты это делаеш - если под линукс, то все должно получатся
- там размер буфера pipe 4к - просто ситема может ждать определенного уровня заполнения буфера.
Что-бы совсем все номано было нужно размер буфера этому  pipe выставить маленьким.
А как можно размер буфера pipe установить в минимальное значение?
Хочу сделать обработку вывода tcpdump и вывод результатов в наглядном виде. Беда в том, что когда в tcpdump задаешь фильтр, который отбирает мало пакетов, то задержки получаются очень существенные.
В идеале надо, чтобы строчка сформированная tcpdump-ом обрабатывалась сразу.
import subprocess

cmd='echo YOUPASSWORD|sudo -S tcpdump -qnippp0 greater 1200'
p=subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
for str in p.stdout: print str
Отвечу сам себе - похоже, что pexpect единственное, что позволяет работать с выводом внешнего процесса в реалтайме. Вот, переписаный кусок предыдущего кода под pexpect:
import pexpect

cmd='sudo -S tcpdump -qnippp0 greater 1200'

child = pexpect.spawn (cmd)
child.expect (':')
child.sendline ('YOUPASSWORD')

while True:
child.expect ('\n')
print child.before
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB