Отлов умирающего процесса в pexpect

Я пишу некоторые вещи pexpect, которые в основном отправляют команды через telnet.

Но вполне возможно, что мой сеанс telnet может прерваться (из-за проблем с сетью, выдергивания кабеля и многого другого).

Как мне инициализировать сеанс telnet так, чтобы, если он умирает, я мог поймать его и сказать ему переподключиться, а затем продолжить выполнение кода, где он был.

Это возможно?


person eastydude5    schedule 09.04.2011    source источник


Ответы (2)


ИМХО, обычно лучше использовать поддерживаемую в настоящее время библиотеку, например exscript или telnetlib, но эффективным заклинанием в pexpect является:

import pexpect as px

cmds = ['cmd1', 'cmd2', 'cmd3']
retcode = -1
while (retcode<10):
    if (retcode<2):
        child = px.spawn('telnet %s %s' % (ip_addr,port))
    lregex = '(sername:)'            # Insert regex for login prompt here
    pregex = '(prompt1>)|(prompt2$)' # Insert your prompt regex here
    # retcode = 0 for px.TIMEOUT, 1 for px.EOF, 2 for lregex match...
    retcode = child.expect([px.TIMEOUT, px.EOF, lregex, pregex],timeout = 10)
    if (retcode==2):
        do_login(child)  # Build a do_login() method to send user / passwd
    elif (2<retcode<10) and (len(cmds)>0):
        cmd = cmds.pop(0)
        child.sendline(cmd)
    else:
        retcode = 10
person This    schedule 09.04.2011
comment
+1 за использование слова заклинание: оно делает программирование похожим на темную магию. - person slezica; 09.04.2011

Я сделал это, и это сработало:

def telnet_connect():
    print "Trying to connect via telnet..."
    telnet_connecting = pexpect.spawn('telnet localhost 10023', timeout=2)
    while 1:
        try:
            telnet_connecting.expect('login: ')
            break
        except:
            telnet_connecting = telnet_connect()
            break
    return telnet_connecting

Рекурсия FTW?

person eastydude5    schedule 09.04.2011
comment
Когда вы отправляете что-либо выше на логин? Что бы вы ни делали, вам нужно будет учитывать pexpect's необходимость видеть send / expect в парах... - person This; 09.04.2011