Kurz-Doku zur Nutzung von Python Expect ======================================= 12.3.2007 Einführungs-Beispiel -------------------- import pexpect child = pexpect.spawn('ftp ftp.openbsd.org') child.expect('Name .*: ') child.sendline('anonymous') child.expect('Password:') child.sendline('noah@example.com') child.expect('ftp> ') child.sendline('cd pub') child.expect('ftp> ') child.sendline('get ls-lR.gz') child.expect('ftp> ') child.sendline('bye') Start der zu steuernden Applikation (des Kindes) ------------------------------------------------ child = pexpect.spawn(...) Warten auf eine bestimmte Meldung von der Applikation ----------------------------------------------------- child.expect(...) Argument : Regexp oder Liste von Regexps Return Code: Index des Treffers Angabe des Timeouts bei expect(): expect(..., timeout = timeout) Default-Timeout : 30 Sekunden unendlicher Timeout: None expect()-Call setzt mehrere Properties: child.before - Text vor dem Match-Text child.after - Match-Text child.match - Match-Object (s. Modul re) Timeout und EOF können als Exceptions pexpect.TIMEOUT pexpect.EOF oder als Index des Treffers gemeldet werden: nr = expect([..., pexpect.TIMEOUT, pexpect.EOF]) nr = expect([..., pexpect.TIMEOUT, pexpect.EOF], timeout = timeout) Besonderheiten bei den Regexps ------------------------------ Zeilenende: OK: child.expect('\r\n') child.expect('\n') Achtung: Zeilenende ist immer '\r\n' (Terminal-like) '$' ist falsch, da Expect logisch gesehen zeichenweise liest und somit immer das durch $ symbolisierte Zeilenende vorliegt: child.expect('$') also weglassen alle Matches werden minimal realisiert (non-greedy): .+ matcht genau 1 Zeichen .* matcht 0 Zeichen alle Regexps werden mit dem DOTALL-Flag kompiliert: . matcht somit Newline Debug-Ausgabe ------------- try: i = child.expect(...) except: print 'Ausnahme aufgetreten' print 'Debug-Information:' print str(child) Iteration über den von der Applikation gesendeten Zeilen -------------------------------------------------------- child = pexpect.spawn('ls -l') for line in child: print line Übergabe von Daten an die Applikation ------------------------------------- child.send(...) child.sendline(...) Argument: String Verzögerung vor dem Senden (in Sekunden) child.delaybeforesend = 0 Default: 0.1 Sekunden Größe des Expect-Buffers ------------------------ child.maxread = 1000 Übergabe der Steuerung der Applikation an den Nutzer ---------------------------------------------------- child.interact() Log-File einstellen ------------------- Beispiel: child.logfile = sys.stdout Echo-Modus ein/aus ------------------ child.setecho(True) child.setecho(False) Kind (Applikation) beenden -------------------------- child.kill(0) Argument ist Signal-Nummer Festellung, ob Applikation lebt ------------------------------- child.isalive() erster Aufruf nach Tod des Kindes setzt self.exitstatus und self.signalstatus Exit-Status und Signal-Status eines Kindes ------------------------------------------ self.exitstatus self.signalstatus None bei lebendem Kind