title: Python pexpect - TIMEOUT falls into traceback and exits
body: <p>I'm new to python-pexpect.   In Tcl/expect when I hit a timeout - I would respond with message and exit the function.  I have tried to experiment with similar response using sample code posted 
  <a href="http://pexpect.svn.sourceforge.net/viewvc/pexpect/trunk/pexpect/examples/sshls.py?revision=489&amp;view=markup" rel="nofollow">http://pexpect.svn.sourceforge.net/viewvc/pexpect/trunk/pexpect/examples/sshls.py?revision=489&amp;view=markup</a></p>
  
  <p>I based on this code above - if I give a bogus password, I would expect this to just timeout, print "ERROR!", and exit program.  But when I run it - goes into a 'Traceback output (see below), can someone help me to get the program to print "ERROR" and exit program gracefully.</p>
  
  <pre><code>test@ubuntu:~/scripts$ ./tmout.py 
  Hostname: 192.168.26.84
  User: root
  Password: 
  Timeout exceeded in read_nonblocking().
  &lt;pexpect.spawn object at 0xb77309cc&gt;
  version: 2.3 ($Revision: 399 $)
  command: /usr/bin/ssh
  args: ['/usr/bin/ssh', '-l', 'root', '192.168.26.84', '/bin/ls', '-l']
  searcher: searcher_re:
      0: EOF
  buffer (last 100 chars): 
  Permission denied, please try again.
  root@192.168.26.84's password: 
  before (last 100 chars): 
  Permission denied, please try again.
  root@192.168.26.84's password: 
  after: &lt;class 'pexpect.TIMEOUT'&gt;
  match: None
  match_index: None
  exitstatus: None
  flag_eof: False
  pid: 14997
  child_fd: 3
  closed: False
  timeout: 30
  delimiter: &lt;class 'pexpect.EOF'&gt;
  logfile: None
  logfile_read: None
  logfile_send: None
  maxread: 2000
  ignorecase: False
  searchwindowsize: None
  delaybeforesend: 0.05
  delayafterclose: 0.1
  delayafterterminate: 0.1
  Traceback (most recent call last):
    File "./tmout.py", line 54, in &lt;module&gt;
      traceback.print_exc()
  NameError: name 'traceback' is not defined
  test@ubuntu:~/scripts$ 
  </code></pre>
  
  <p>Source Code:</p>
  
  <pre><code>#!/usr/bin/env python
  
  """This runs 'ls -l' on a remote host using SSH. At the prompts enter hostname,
  user, and password.
  
  $Id$
  """
  
  import pexpect
  import getpass, os
  
  def ssh_command (user, host, password, command):
  
      """This runs a command on the remote host. This could also be done with the
  pxssh class, but this demonstrates what that class does at a simpler level.
  This returns a pexpect.spawn object. This handles the case when you try to
  connect to a new host and ssh asks you if you want to accept the public key
  fingerprint and continue connecting. """
  
      ssh_newkey = 'Are you sure you want to continue connecting'
      child = pexpect.spawn('ssh -l %s %s %s'%(user, host, command))
      i = child.expect([pexpect.TIMEOUT, ssh_newkey, 'password: '])
      if i == 0: # Timeout
          print 'ERROR!'
          print 'SSH could not login. Here is what SSH said:'
          print child.before, child.after
          return None
      if i == 1: # SSH does not have the public key. Just accept it.
          child.sendline ('yes')
          child.expect ('password: ')
          i = child.expect([pexpect.TIMEOUT, 'password: '])
          if i == 0: # Timeout
              print 'ERROR!'
              print 'SSH could not login. Here is what SSH said:'
              print child.before, child.after
              return None       
      child.sendline(password)
      return child
  
  def main ():
  
      host = raw_input('Hostname: ')
      user = raw_input('User: ')
      password = getpass.getpass('Password: ')
      child = ssh_command (user, host, password, '/bin/ls -l')
      child.expect(pexpect.EOF)
      print child.before
  
  if __name__ == '__main__':
      try:
          main()
      except Exception, e:
          print str(e)
          traceback.print_exc()
          os._exit(1)
  </code></pre>