LINUX.ORG.RU

Обертка для консольной программы, pexpect, как не грузить программу каждый раз?

 , , ,


0

3

Есть некая программа (20 мб бинарник и не быстрая) , работает только в командной строке:

После запуска приглашает promt-ом к диалогу. Вводишь слово- Enter- она выдает слово-результат своей работы.
Затем программа не закрывается- её курсор стоит в конце слова-результата, приглашает к следующей итерации «слово -> результат» .

Мне нужна функция в Pythone, которая получает результат, обращаясь к этой программе. Я ее написал в pexpect :

def stm(z):
p=pexpect.spawn('path-to-the-application')
p.setecho(False)
p.delaybeforesend=0
p.delayafterclose=0
p.delayafterterminate=0
p.expect(«program's prompt»)
p.sendline(z)
p.expect(".+")
return p.after

Она делает что надо -вовзращает результат обработки слова. Но по непонятным мне причинам она закрывает программу после обработки слова - этого нет если всё делать руками. Полагаю, что каждый раз вызывать программу в 20 мб с диска - времязатратно... Есть идеи, как подкрутить скрипт, чтобы после обработки слова консольная программа ждала обработки следующего слова, а не закрывалась?

Ответ на: комментарий от most-fucktum

спасиб. сам думал о таком примерно, пробую

pexpect
() автор топика
Ответ на: комментарий от most-fucktum

не проходит.

если делать не функцией, без всяких return - то все равно после строк

p.expect(".+") print(p.after)

консольная программа почему то закрывается, и достаточно быстро- пара секунд, явно дело не в таймаутах.

хотя если руками в консоли ее пускать, она мигает курсором и ждет следующего слова. И выключить ее можно только Cntrl-C..

pexpect
() автор топика
Ответ на: комментарий от most-fucktum

«а в функции только send слово, receive результат »

первое вроде отличается от sendline только тем что не имеет в конце «\n»? send подвешивает всё, в логах вообще пусто.

а что есть «receive» тут? вроде таких методов у expect нет? может readlines??

pexpect
() автор топика

Как уже правильно заметил товарищь выше - тебе нужно передавать в функцию обьект spawn, который должен быть проинициализирован перед вызовом функции.

Тогда ты сможешь вызывать функцию сколько угодно раз без закрытия софтины (пока не выйдет из зоны видимости обьект spawn или как там в питоне принимается решение об очистке ресуров).

pon4ik ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.