Tampa Tampa - 1 year ago 168
Python Question

Pexpect does not respect timeouts

pexpect is not working with time outs.

import pexpect
import sys
import os
os.system("""git config --global user.name '#{git_name}'""")
os.system("""git config --global user.email '#{git_email}'""")
child = pexpect.spawn ('git clone https://github.com/davidmontgom/rtbopsConfig.git')
child.logfile = sys.stdout
child.expect ('Username:*')
child.sendline ('#{git_username}')
child.expect ('Pass*')
child.sendline ('#{git_password}')
child.expect(pexpect.EOF, timeout=420)
os.system('cd /home/ubuntu/workspace/rtbopsConfig; git checkout #{branch_name}')

Receiving objects: 16% (1751/10655), 19.36 MiB | 876 KiB/s KiB/s
Receiving objects: 16% (1751/10655), 20.64 MiB | 861 KiB/s STDERR: Traceback (most recent call last): File "/tmp/chef-script20121006-19825-5yog10", line 12, in <module> child.expect(pexpect.EOF) File "/usr/local/lib/python2.7/dist-packages/pexpect-2.4-py2.7.egg/pexpect.py", line 1316, in expect return self.expect_list(compiled_pattern_list, timeout, searchwindowsize) File "/usr/local/lib/python2.7/dist-packages/pexpect-2.4-py2.7.egg/pexpect.py", line 1330, in expect_list return self.expect_loop(searcher_re(pattern_list), timeout, searchwindowsize) File "/usr/local/lib/python2.7/dist-packages/pexpect-2.4-py2.7.egg/pexpect.py", line 1414, in expect_loop raise TIMEOUT (str(e) + '\n' + str(self)) pexpect.TIMEOUT: Timeout exceeded in read_nonblocking(). <pexpect.spawn object at 0x7fbb24704750> version: 2.4 ($Revision: 516 $) command: /usr/bin/git args: ['/usr/bin/git', 'clone', 'https://github.com/davidmontgom/rtbopsConfig.git'] searcher: searcher_re: 0: EOF
Receiving objects: 16% (1751/10655), 20.64 MiB | 861 KiB/s 873 KiB/s
Receiving objects: 16% (1751/10655), 20.64 MiB | 861 KiB/s 873 KiB/s after: <class 'pexpect.TIMEOUT'>

How do I get pexpect to work?

Answer Source

pexpect raises an exception on timeout (in 30 seconds by default). If you don't want an exception; specify pexpect.TIMEOUT as a pattern for .expect().

In your example git clone produces pexpect.Timeout exception after default timeout on .expect(pexpect.EOF). Try:

i = child.expect([EOF, TIMEOUT], timeout=git_clone_timeout)
if i == 1: 
    # handle timeout
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download