Home | History | Annotate | Download | only in pexpect
      1 """Pexpect is a Python module for spawning child applications and controlling
      2 them automatically. Pexpect can be used for automating interactive applications
      3 such as ssh, ftp, passwd, telnet, etc. It can be used to a automate setup
      4 scripts for duplicating software package installations on different servers. It
      5 can be used for automated software testing. Pexpect is in the spirit of Don
      6 Libes' Expect, but Pexpect is pure Python. Other Expect-like modules for Python
      7 require TCL and Expect or require C extensions to be compiled. Pexpect does not
      8 use C, Expect, or TCL extensions. It should work on any platform that supports
      9 the standard Python pty module. The Pexpect interface focuses on ease of use so
     10 that simple tasks are easy.
     11 
     12 There are two main interfaces to the Pexpect system; these are the function,
     13 run() and the class, spawn. The spawn class is more powerful. The run()
     14 function is simpler than spawn, and is good for quickly calling program. When
     15 you call the run() function it executes a given program and then returns the
     16 output. This is a handy replacement for os.system().
     17 
     18 For example::
     19 
     20     pexpect.run('ls -la')
     21 
     22 The spawn class is the more powerful interface to the Pexpect system. You can
     23 use this to spawn a child program then interact with it by sending input and
     24 expecting responses (waiting for patterns in the child's output).
     25 
     26 For example::
     27 
     28     child = pexpect.spawn('scp foo user (at] example.com:.')
     29     child.expect('Password:')
     30     child.sendline(mypassword)
     31 
     32 This works even for commands that ask for passwords or other input outside of
     33 the normal stdio streams. For example, ssh reads input directly from the TTY
     34 device which bypasses stdin.
     35 
     36 Credits: Noah Spurrier, Richard Holden, Marco Molteni, Kimberley Burchett,
     37 Robert Stone, Hartmut Goebel, Chad Schroeder, Erick Tryzelaar, Dave Kirby, Ids
     38 vander Molen, George Todd, Noel Taylor, Nicolas D. Cesar, Alexander Gattin,
     39 Jacques-Etienne Baudoux, Geoffrey Marshall, Francisco Lourenco, Glen Mabey,
     40 Karthik Gurusamy, Fernando Perez, Corey Minyard, Jon Cohen, Guillaume
     41 Chazarain, Andrew Ryan, Nick Craig-Wood, Andrew Stone, Jorgen Grahn, John
     42 Spiegel, Jan Grant, and Shane Kerr. Let me know if I forgot anyone.
     43 
     44 Pexpect is free, open source, and all that good stuff.
     45 http://pexpect.sourceforge.net/
     46 
     47 PEXPECT LICENSE
     48 
     49     This license is approved by the OSI and FSF as GPL-compatible.
     50         http://opensource.org/licenses/isc-license.txt
     51 
     52     Copyright (c) 2012, Noah Spurrier <noah (at] noah.org>
     53     PERMISSION TO USE, COPY, MODIFY, AND/OR DISTRIBUTE THIS SOFTWARE FOR ANY
     54     PURPOSE WITH OR WITHOUT FEE IS HEREBY GRANTED, PROVIDED THAT THE ABOVE
     55     COPYRIGHT NOTICE AND THIS PERMISSION NOTICE APPEAR IN ALL COPIES.
     56     THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
     57     WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     58     MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
     59     ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     60     WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
     61     ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
     62     OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     63 
     64 """
     65 
     66 try:
     67     import os
     68     import sys
     69     import time
     70     import select
     71     import string
     72     import re
     73     import struct
     74     import resource
     75     import types
     76     import pty
     77     import tty
     78     import termios
     79     import fcntl
     80     import errno
     81     import traceback
     82     import signal
     83 except ImportError as e:
     84     raise ImportError(str(e) + """
     85 
     86 A critical module was not found. Probably this operating system does not
     87 support it. Pexpect is intended for UNIX-like operating systems.""")
     88 
     89 __version__ = '2.6'
     90 __revision__ = '1'
     91 __all__ = ['ExceptionPexpect', 'EOF', 'TIMEOUT', 'spawn', 'run', 'which',
     92     'split_command_line', '__version__', '__revision__']
     93 
     94 
     95 # Exception classes used by this module.
     96 class ExceptionPexpect(Exception):
     97 
     98     """Base class for all exceptions raised by this module.
     99     """
    100 
    101     def __init__(self, value):
    102 
    103         self.value = value
    104 
    105     def __str__(self):
    106 
    107         return str(self.value)
    108 
    109     def get_trace(self):
    110 
    111         """This returns an abbreviated stack trace with lines that only concern
    112         the caller. In other words, the stack trace inside the Pexpect module
    113         is not included. """
    114 
    115         tblist = traceback.extract_tb(sys.exc_info()[2])
    116         #tblist = filter(self.__filter_not_pexpect, tblist)
    117         tblist = [item for item in tblist if self.__filter_not_pexpect(item)]
    118         tblist = traceback.format_list(tblist)
    119         return ''.join(tblist)
    120 
    121     def __filter_not_pexpect(self, trace_list_item):
    122 
    123         """This returns True if list item 0 the string 'pexpect.py' in it. """
    124 
    125         if trace_list_item[0].find('pexpect.py') == -1:
    126             return True
    127         else:
    128             return False
    129 
    130 
    131 class EOF(ExceptionPexpect):
    132 
    133     """Raised when EOF is read from a child.
    134     This usually means the child has exited."""
    135 
    136 
    137 class TIMEOUT(ExceptionPexpect):
    138 
    139     """Raised when a read time exceeds the timeout. """
    140 
    141 ##class TIMEOUT_PATTERN(TIMEOUT):
    142 ##    """Raised when the pattern match time exceeds the timeout.
    143 ##    This is different than a read TIMEOUT because the child process may
    144 ##    give output, thus never give a TIMEOUT, but the output
    145 ##    may never match a pattern.
    146 ##    """
    147 ##class MAXBUFFER(ExceptionPexpect):
    148 ##    """Raised when a buffer fills before matching an expected pattern."""
    149 
    150 
    151 def run(command, timeout=-1, withexitstatus=False, events=None,
    152         extra_args=None, logfile=None, cwd=None, env=None):
    153 
    154     """
    155     This function runs the given command; waits for it to finish; then
    156     returns all output as a string. STDERR is included in output. If the full
    157     path to the command is not given then the path is searched.
    158 
    159     Note that lines are terminated by CR/LF (\\r\\n) combination even on
    160     UNIX-like systems because this is the standard for pseudottys. If you set
    161     'withexitstatus' to true, then run will return a tuple of (command_output,
    162     exitstatus). If 'withexitstatus' is false then this returns just
    163     command_output.
    164 
    165     The run() function can often be used instead of creating a spawn instance.
    166     For example, the following code uses spawn::
    167 
    168         from pexpect import *
    169         child = spawn('scp foo user (at] example.com:.')
    170         child.expect('(?i)password')
    171         child.sendline(mypassword)
    172 
    173     The previous code can be replace with the following::
    174 
    175         from pexpect import *
    176         run('scp foo user (at] example.com:.', events={'(?i)password': mypassword})
    177 
    178     Examples
    179     ========
    180 
    181     Start the apache daemon on the local machine::
    182 
    183         from pexpect import *
    184         run("/usr/local/apache/bin/apachectl start")
    185 
    186     Check in a file using SVN::
    187 
    188         from pexpect import *
    189         run("svn ci -m 'automatic commit' my_file.py")
    190 
    191     Run a command and capture exit status::
    192 
    193         from pexpect import *
    194         (command_output, exitstatus) = run('ls -l /bin', withexitstatus=1)
    195 
    196     Tricky Examples
    197     ===============
    198 
    199     The following will run SSH and execute 'ls -l' on the remote machine. The
    200     password 'secret' will be sent if the '(?i)password' pattern is ever seen::
    201 
    202         run("ssh username@machine.example.com 'ls -l'",
    203             events={'(?i)password':'secret\\n'})
    204 
    205     This will start mencoder to rip a video from DVD. This will also display
    206     progress ticks every 5 seconds as it runs. For example::
    207 
    208         from pexpect import *
    209         def print_ticks(d):
    210             print d['event_count'],
    211         run("mencoder dvd://1 -o video.avi -oac copy -ovc copy",
    212             events={TIMEOUT:print_ticks}, timeout=5)
    213 
    214     The 'events' argument should be a dictionary of patterns and responses.
    215     Whenever one of the patterns is seen in the command out run() will send the
    216     associated response string. Note that you should put newlines in your
    217     string if Enter is necessary. The responses may also contain callback
    218     functions. Any callback is function that takes a dictionary as an argument.
    219     The dictionary contains all the locals from the run() function, so you can
    220     access the child spawn object or any other variable defined in run()
    221     (event_count, child, and extra_args are the most useful). A callback may
    222     return True to stop the current run process otherwise run() continues until
    223     the next event. A callback may also return a string which will be sent to
    224     the child. 'extra_args' is not used by directly run(). It provides a way to
    225     pass data to a callback function through run() through the locals
    226     dictionary passed to a callback. """
    227 
    228     if timeout == -1:
    229         child = spawn(command, maxread=2000, logfile=logfile, cwd=cwd, env=env)
    230     else:
    231         child = spawn(command, timeout=timeout, maxread=2000, logfile=logfile,
    232                 cwd=cwd, env=env)
    233     if events is not None:
    234         patterns = list(events.keys())
    235         responses = list(events.values())
    236     else:
    237         # This assumes EOF or TIMEOUT will eventually cause run to terminate.
    238         patterns = None
    239         responses = None
    240     child_result_list = []
    241     event_count = 0
    242     while True:
    243         try:
    244             index = child.expect(patterns)
    245             if type(child.after) in types.StringTypes:
    246                 child_result_list.append(child.before + child.after)
    247             else:
    248                 # child.after may have been a TIMEOUT or EOF,
    249                 # which we don't want appended to the list.
    250                 child_result_list.append(child.before)
    251             if type(responses[index]) in types.StringTypes:
    252                 child.send(responses[index])
    253             elif isinstance(responses[index], types.FunctionType):
    254                 callback_result = responses[index](locals())
    255                 sys.stdout.flush()
    256                 if type(callback_result) in types.StringTypes:
    257                     child.send(callback_result)
    258                 elif callback_result:
    259                     break
    260             else:
    261                 raise TypeError('The callback must be a string or function.')
    262             event_count = event_count + 1
    263         except TIMEOUT as e:
    264             child_result_list.append(child.before)
    265             break
    266         except EOF as e:
    267             child_result_list.append(child.before)
    268             break
    269     child_result = ''.join(child_result_list)
    270     if withexitstatus:
    271         child.close()
    272         return (child_result, child.exitstatus)
    273     else:
    274         return child_result
    275 
    276 
    277 class spawn(object):
    278 
    279     """This is the main class interface for Pexpect. Use this class to start
    280     and control child applications. """
    281 
    282     def __init__(self, command, args=[], timeout=30, maxread=2000,
    283         searchwindowsize=None, logfile=None, cwd=None, env=None):
    284 
    285         """This is the constructor. The command parameter may be a string that
    286         includes a command and any arguments to the command. For example::
    287 
    288             child = pexpect.spawn('/usr/bin/ftp')
    289             child = pexpect.spawn('/usr/bin/ssh user (at] example.com')
    290             child = pexpect.spawn('ls -latr /tmp')
    291 
    292         You may also construct it with a list of arguments like so::
    293 
    294             child = pexpect.spawn('/usr/bin/ftp', [])
    295             child = pexpect.spawn('/usr/bin/ssh', ['user (at] example.com'])
    296             child = pexpect.spawn('ls', ['-latr', '/tmp'])
    297 
    298         After this the child application will be created and will be ready to
    299         talk to. For normal use, see expect() and send() and sendline().
    300 
    301         Remember that Pexpect does NOT interpret shell meta characters such as
    302         redirect, pipe, or wild cards (>, |, or *). This is a common mistake.
    303         If you want to run a command and pipe it through another command then
    304         you must also start a shell. For example::
    305 
    306             child = pexpect.spawn('/bin/bash -c "ls -l | grep LOG > logs.txt"')
    307             child.expect(pexpect.EOF)
    308 
    309         The second form of spawn (where you pass a list of arguments) is useful
    310         in situations where you wish to spawn a command and pass it its own
    311         argument list. This can make syntax more clear. For example, the
    312         following is equivalent to the previous example::
    313 
    314             shell_cmd = 'ls -l | grep LOG > logs.txt'
    315             child = pexpect.spawn('/bin/bash', ['-c', shell_cmd])
    316             child.expect(pexpect.EOF)
    317 
    318         The maxread attribute sets the read buffer size. This is maximum number
    319         of bytes that Pexpect will try to read from a TTY at one time. Setting
    320         the maxread size to 1 will turn off buffering. Setting the maxread
    321         value higher may help performance in cases where large amounts of
    322         output are read back from the child. This feature is useful in
    323         conjunction with searchwindowsize.
    324 
    325         The searchwindowsize attribute sets the how far back in the incomming
    326         seach buffer Pexpect will search for pattern matches. Every time
    327         Pexpect reads some data from the child it will append the data to the
    328         incomming buffer. The default is to search from the beginning of the
    329         imcomming buffer each time new data is read from the child. But this is
    330         very inefficient if you are running a command that generates a large
    331         amount of data where you want to match The searchwindowsize does not
    332         effect the size of the incomming data buffer. You will still have
    333         access to the full buffer after expect() returns.
    334 
    335         The logfile member turns on or off logging. All input and output will
    336         be copied to the given file object. Set logfile to None to stop
    337         logging. This is the default. Set logfile to sys.stdout to echo
    338         everything to standard output. The logfile is flushed after each write.
    339 
    340         Example log input and output to a file::
    341 
    342             child = pexpect.spawn('some_command')
    343             fout = file('mylog.txt','w')
    344             child.logfile = fout
    345 
    346         Example log to stdout::
    347 
    348             child = pexpect.spawn('some_command')
    349             child.logfile = sys.stdout
    350 
    351         The logfile_read and logfile_send members can be used to separately log
    352         the input from the child and output sent to the child. Sometimes you
    353         don't want to see everything you write to the child. You only want to
    354         log what the child sends back. For example::
    355 
    356             child = pexpect.spawn('some_command')
    357             child.logfile_read = sys.stdout
    358 
    359         To separately log output sent to the child use logfile_send::
    360 
    361             self.logfile_send = fout
    362 
    363         The delaybeforesend helps overcome a weird behavior that many users
    364         were experiencing. The typical problem was that a user would expect() a
    365         "Password:" prompt and then immediately call sendline() to send the
    366         password. The user would then see that their password was echoed back
    367         to them. Passwords don't normally echo. The problem is caused by the
    368         fact that most applications print out the "Password" prompt and then
    369         turn off stdin echo, but if you send your password before the
    370         application turned off echo, then you get your password echoed.
    371         Normally this wouldn't be a problem when interacting with a human at a
    372         real keyboard. If you introduce a slight delay just before writing then
    373         this seems to clear up the problem. This was such a common problem for
    374         many users that I decided that the default pexpect behavior should be
    375         to sleep just before writing to the child application. 1/20th of a
    376         second (50 ms) seems to be enough to clear up the problem. You can set
    377         delaybeforesend to 0 to return to the old behavior. Most Linux machines
    378         don't like this to be below 0.03. I don't know why.
    379 
    380         Note that spawn is clever about finding commands on your path.
    381         It uses the same logic that "which" uses to find executables.
    382 
    383         If you wish to get the exit status of the child you must call the
    384         close() method. The exit or signal status of the child will be stored
    385         in self.exitstatus or self.signalstatus. If the child exited normally
    386         then exitstatus will store the exit return code and signalstatus will
    387         be None. If the child was terminated abnormally with a signal then
    388         signalstatus will store the signal value and exitstatus will be None.
    389         If you need more detail you can also read the self.status member which
    390         stores the status returned by os.waitpid. You can interpret this using
    391         os.WIFEXITED/os.WEXITSTATUS or os.WIFSIGNALED/os.TERMSIG. """
    392 
    393         self.STDIN_FILENO = pty.STDIN_FILENO
    394         self.STDOUT_FILENO = pty.STDOUT_FILENO
    395         self.STDERR_FILENO = pty.STDERR_FILENO
    396         self.stdin = sys.stdin
    397         self.stdout = sys.stdout
    398         self.stderr = sys.stderr
    399 
    400         self.searcher = None
    401         self.ignorecase = False
    402         self.before = None
    403         self.after = None
    404         self.match = None
    405         self.match_index = None
    406         self.terminated = True
    407         self.exitstatus = None
    408         self.signalstatus = None
    409         # status returned by os.waitpid
    410         self.status = None
    411         self.flag_eof = False
    412         self.pid = None
    413         # the chile filedescriptor is initially closed
    414         self.child_fd = -1
    415         self.timeout = timeout
    416         self.delimiter = EOF
    417         self.logfile = logfile
    418         # input from child (read_nonblocking)
    419         self.logfile_read = None
    420         # output to send (send, sendline)
    421         self.logfile_send = None
    422         # max bytes to read at one time into buffer
    423         self.maxread = maxread
    424         # This is the read buffer. See maxread.
    425         self.buffer = ''
    426         # Data before searchwindowsize point is preserved, but not searched.
    427         self.searchwindowsize = searchwindowsize
    428         # Delay used before sending data to child. Time in seconds.
    429         # Most Linux machines don't like this to be below 0.03 (30 ms).
    430         self.delaybeforesend = 0.05
    431         # Used by close() to give kernel time to update process status.
    432         # Time in seconds.
    433         self.delayafterclose = 0.1
    434         # Used by terminate() to give kernel time to update process status.
    435         # Time in seconds.
    436         self.delayafterterminate = 0.1
    437         self.softspace = False
    438         self.name = '<' + repr(self) + '>'
    439         self.encoding = None
    440         self.closed = True
    441         self.cwd = cwd
    442         self.env = env
    443         # This flags if we are running on irix
    444         self.__irix_hack = (sys.platform.lower().find('irix') >= 0)
    445         # Solaris uses internal __fork_pty(). All others use pty.fork().
    446         if ((sys.platform.lower().find('solaris') >= 0)
    447             or (sys.platform.lower().find('sunos5') >= 0)):
    448             self.use_native_pty_fork = False
    449         else:
    450             self.use_native_pty_fork = True
    451 
    452         # Support subclasses that do not use command or args.
    453         if command is None:
    454             self.command = None
    455             self.args = None
    456             self.name = '<pexpect factory incomplete>'
    457         else:
    458             self._spawn(command, args)
    459 
    460     def __del__(self):
    461 
    462         """This makes sure that no system resources are left open. Python only
    463         garbage collects Python objects. OS file descriptors are not Python
    464         objects, so they must be handled explicitly. If the child file
    465         descriptor was opened outside of this class (passed to the constructor)
    466         then this does not close it. """
    467 
    468         if not self.closed:
    469             # It is possible for __del__ methods to execute during the
    470             # teardown of the Python VM itself. Thus self.close() may
    471             # trigger an exception because os.close may be None.
    472             # -- Fernando Perez
    473             try:
    474                 self.close()
    475             except:
    476                 pass
    477 
    478     def __str__(self):
    479 
    480         """This returns a human-readable string that represents the state of
    481         the object. """
    482 
    483         s = []
    484         s.append(repr(self))
    485         s.append('version: ' + __version__ + ' (' + __revision__ + ')')
    486         s.append('command: ' + str(self.command))
    487         s.append('args: ' + str(self.args))
    488         s.append('searcher: ' + str(self.searcher))
    489         s.append('buffer (last 100 chars): ' + str(self.buffer)[-100:])
    490         s.append('before (last 100 chars): ' + str(self.before)[-100:])
    491         s.append('after: ' + str(self.after))
    492         s.append('match: ' + str(self.match))
    493         s.append('match_index: ' + str(self.match_index))
    494         s.append('exitstatus: ' + str(self.exitstatus))
    495         s.append('flag_eof: ' + str(self.flag_eof))
    496         s.append('pid: ' + str(self.pid))
    497         s.append('child_fd: ' + str(self.child_fd))
    498         s.append('closed: ' + str(self.closed))
    499         s.append('timeout: ' + str(self.timeout))
    500         s.append('delimiter: ' + str(self.delimiter))
    501         s.append('logfile: ' + str(self.logfile))
    502         s.append('logfile_read: ' + str(self.logfile_read))
    503         s.append('logfile_send: ' + str(self.logfile_send))
    504         s.append('maxread: ' + str(self.maxread))
    505         s.append('ignorecase: ' + str(self.ignorecase))
    506         s.append('searchwindowsize: ' + str(self.searchwindowsize))
    507         s.append('delaybeforesend: ' + str(self.delaybeforesend))
    508         s.append('delayafterclose: ' + str(self.delayafterclose))
    509         s.append('delayafterterminate: ' + str(self.delayafterterminate))
    510         return '\n'.join(s)
    511 
    512     def _spawn(self, command, args=[]):
    513 
    514         """This starts the given command in a child process. This does all the
    515         fork/exec type of stuff for a pty. This is called by __init__. If args
    516         is empty then command will be parsed (split on spaces) and args will be
    517         set to parsed arguments. """
    518 
    519         # The pid and child_fd of this object get set by this method.
    520         # Note that it is difficult for this method to fail.
    521         # You cannot detect if the child process cannot start.
    522         # So the only way you can tell if the child process started
    523         # or not is to try to read from the file descriptor. If you get
    524         # EOF immediately then it means that the child is already dead.
    525         # That may not necessarily be bad because you may have spawned a child
    526         # that performs some task; creates no stdout output; and then dies.
    527 
    528         # If command is an int type then it may represent a file descriptor.
    529         if isinstance(command, type(0)):
    530             raise ExceptionPexpect('Command is an int type. ' +
    531                     'If this is a file descriptor then maybe you want to ' +
    532                     'use fdpexpect.fdspawn which takes an existing ' +
    533                     'file descriptor instead of a command string.')
    534 
    535         if not isinstance(args, type([])):
    536             raise TypeError('The argument, args, must be a list.')
    537 
    538         if args == []:
    539             self.args = split_command_line(command)
    540             self.command = self.args[0]
    541         else:
    542             # Make a shallow copy of the args list.
    543             self.args = args[:]
    544             self.args.insert(0, command)
    545             self.command = command
    546 
    547         command_with_path = which(self.command)
    548         if command_with_path is None:
    549             raise ExceptionPexpect('The command was not found or was not ' +
    550                     'executable: %s.' % self.command)
    551         self.command = command_with_path
    552         self.args[0] = self.command
    553 
    554         self.name = '<' + ' '.join(self.args) + '>'
    555 
    556         assert self.pid is None, 'The pid member must be None.'
    557         assert self.command is not None, 'The command member must not be None.'
    558 
    559         if self.use_native_pty_fork:
    560             try:
    561                 self.pid, self.child_fd = pty.fork()
    562             except OSError as e:
    563                 raise ExceptionPexpect('pty.fork() failed: ' + str(e))
    564         else:
    565             # Use internal __fork_pty
    566             self.pid, self.child_fd = self.__fork_pty()
    567 
    568         if self.pid == 0:
    569             # Child
    570             try:
    571                 # used by setwinsize()
    572                 self.child_fd = sys.stdout.fileno()
    573                 self.setwinsize(24, 80)
    574             except:
    575                 # Some platforms do not like setwinsize (Cygwin).
    576                 # This will cause problem when running applications that
    577                 # are very picky about window size.
    578                 # This is a serious limitation, but not a show stopper.
    579                 pass
    580             # Do not allow child to inherit open file descriptors from parent.
    581             max_fd = resource.getrlimit(resource.RLIMIT_NOFILE)[0]
    582             for i in range(3, max_fd):
    583                 try:
    584                     os.close(i)
    585                 except OSError:
    586                     pass
    587 
    588             # I don't know why this works, but ignoring SIGHUP fixes a
    589             # problem when trying to start a Java daemon with sudo
    590             # (specifically, Tomcat).
    591             signal.signal(signal.SIGHUP, signal.SIG_IGN)
    592 
    593             if self.cwd is not None:
    594                 os.chdir(self.cwd)
    595             if self.env is None:
    596                 os.execv(self.command, self.args)
    597             else:
    598                 os.execvpe(self.command, self.args, self.env)
    599 
    600         # Parent
    601         self.terminated = False
    602         self.closed = False
    603 
    604     def __fork_pty(self):
    605 
    606         """This implements a substitute for the forkpty system call. This
    607         should be more portable than the pty.fork() function. Specifically,
    608         this should work on Solaris.
    609 
    610         Modified 10.06.05 by Geoff Marshall: Implemented __fork_pty() method to
    611         resolve the issue with Python's pty.fork() not supporting Solaris,
    612         particularly ssh. Based on patch to posixmodule.c authored by Noah
    613         Spurrier::
    614 
    615             http://mail.python.org/pipermail/python-dev/2003-May/035281.html
    616 
    617         """
    618 
    619         parent_fd, child_fd = os.openpty()
    620         if parent_fd < 0 or child_fd < 0:
    621             raise ExceptionPexpect("Could not open with os.openpty().")
    622 
    623         pid = os.fork()
    624         if pid < 0:
    625             raise ExceptionPexpect("Failed os.fork().")
    626         elif pid == 0:
    627             # Child.
    628             os.close(parent_fd)
    629             self.__pty_make_controlling_tty(child_fd)
    630 
    631             os.dup2(child_fd, 0)
    632             os.dup2(child_fd, 1)
    633             os.dup2(child_fd, 2)
    634 
    635             if child_fd > 2:
    636                 os.close(child_fd)
    637         else:
    638             # Parent.
    639             os.close(child_fd)
    640 
    641         return pid, parent_fd
    642 
    643     def __pty_make_controlling_tty(self, tty_fd):
    644 
    645         """This makes the pseudo-terminal the controlling tty. This should be
    646         more portable than the pty.fork() function. Specifically, this should
    647         work on Solaris. """
    648 
    649         child_name = os.ttyname(tty_fd)
    650 
    651         # Disconnect from controlling tty. Harmless if not already connected.
    652         try:
    653             fd = os.open("/dev/tty", os.O_RDWR | os.O_NOCTTY)
    654             if fd >= 0:
    655                 os.close(fd)
    656         except:
    657             # Already disconnected. This happens if running inside cron.
    658             pass
    659 
    660         os.setsid()
    661 
    662         # Verify we are disconnected from controlling tty
    663         # by attempting to open it again.
    664         try:
    665             fd = os.open("/dev/tty", os.O_RDWR | os.O_NOCTTY)
    666             if fd >= 0:
    667                 os.close(fd)
    668                 raise ExceptionPexpect('Failed to disconnect from ' +
    669                     'controlling tty. It is still possible to open /dev/tty.')
    670         except:
    671             # Good! We are disconnected from a controlling tty.
    672             pass
    673 
    674         # Verify we can open child pty.
    675         fd = os.open(child_name, os.O_RDWR)
    676         if fd < 0:
    677             raise ExceptionPexpect("Could not open child pty, " + child_name)
    678         else:
    679             os.close(fd)
    680 
    681         # Verify we now have a controlling tty.
    682         fd = os.open("/dev/tty", os.O_WRONLY)
    683         if fd < 0:
    684             raise ExceptionPexpect("Could not open controlling tty, /dev/tty")
    685         else:
    686             os.close(fd)
    687 
    688     def fileno(self):
    689 
    690         """This returns the file descriptor of the pty for the child.
    691         """
    692 
    693         return self.child_fd
    694 
    695     def close(self, force=True):
    696 
    697         """This closes the connection with the child application. Note that
    698         calling close() more than once is valid. This emulates standard Python
    699         behavior with files. Set force to True if you want to make sure that
    700         the child is terminated (SIGKILL is sent if the child ignores SIGHUP
    701         and SIGINT). """
    702 
    703         if not self.closed:
    704             self.flush()
    705             os.close(self.child_fd)
    706             # Give kernel time to update process status.
    707             time.sleep(self.delayafterclose)
    708             if self.isalive():
    709                 if not self.terminate(force):
    710                     raise ExceptionPexpect('Could not terminate the child.')
    711             self.child_fd = -1
    712             self.closed = True
    713             #self.pid = None
    714 
    715     def flush(self):
    716 
    717         """This does nothing. It is here to support the interface for a
    718         File-like object. """
    719 
    720         pass
    721 
    722     def isatty(self):
    723 
    724         """This returns True if the file descriptor is open and connected to a
    725         tty(-like) device, else False. """
    726 
    727         return os.isatty(self.child_fd)
    728 
    729     def waitnoecho(self, timeout=-1):
    730 
    731         """This waits until the terminal ECHO flag is set False. This returns
    732         True if the echo mode is off. This returns False if the ECHO flag was
    733         not set False before the timeout. This can be used to detect when the
    734         child is waiting for a password. Usually a child application will turn
    735         off echo mode when it is waiting for the user to enter a password. For
    736         example, instead of expecting the "password:" prompt you can wait for
    737         the child to set ECHO off::
    738 
    739             p = pexpect.spawn('ssh user (at] example.com')
    740             p.waitnoecho()
    741             p.sendline(mypassword)
    742 
    743         If timeout==-1 then this method will use the value in self.timeout.
    744         If timeout==None then this method to block until ECHO flag is False.
    745         """
    746 
    747         if timeout == -1:
    748             timeout = self.timeout
    749         if timeout is not None:
    750             end_time = time.time() + timeout
    751         while True:
    752             if not self.getecho():
    753                 return True
    754             if timeout < 0 and timeout is not None:
    755                 return False
    756             if timeout is not None:
    757                 timeout = end_time - time.time()
    758             time.sleep(0.1)
    759 
    760     def getecho(self):
    761 
    762         """This returns the terminal echo mode. This returns True if echo is
    763         on or False if echo is off. Child applications that are expecting you
    764         to enter a password often set ECHO False. See waitnoecho(). """
    765 
    766         attr = termios.tcgetattr(self.child_fd)
    767         if attr[3] & termios.ECHO:
    768             return True
    769         return False
    770 
    771     def setecho(self, state):
    772 
    773         """This sets the terminal echo mode on or off. Note that anything the
    774         child sent before the echo will be lost, so you should be sure that
    775         your input buffer is empty before you call setecho(). For example, the
    776         following will work as expected::
    777 
    778             p = pexpect.spawn('cat') # Echo is on by default.
    779             p.sendline('1234') # We expect see this twice from the child...
    780             p.expect(['1234']) # ... once from the tty echo...
    781             p.expect(['1234']) # ... and again from cat itself.
    782             p.setecho(False) # Turn off tty echo
    783             p.sendline('abcd') # We will set this only once (echoed by cat).
    784             p.sendline('wxyz') # We will set this only once (echoed by cat)
    785             p.expect(['abcd'])
    786             p.expect(['wxyz'])
    787 
    788         The following WILL NOT WORK because the lines sent before the setecho
    789         will be lost::
    790 
    791             p = pexpect.spawn('cat')
    792             p.sendline('1234')
    793             p.setecho(False) # Turn off tty echo
    794             p.sendline('abcd') # We will set this only once (echoed by cat).
    795             p.sendline('wxyz') # We will set this only once (echoed by cat)
    796             p.expect(['1234'])
    797             p.expect(['1234'])
    798             p.expect(['abcd'])
    799             p.expect(['wxyz'])
    800         """
    801 
    802         self.child_fd
    803         attr = termios.tcgetattr(self.child_fd)
    804         if state:
    805             attr[3] = attr[3] | termios.ECHO
    806         else:
    807             attr[3] = attr[3] & ~termios.ECHO
    808         # I tried TCSADRAIN and TCSAFLUSH, but
    809         # these were inconsistent and blocked on some platforms.
    810         # TCSADRAIN would probably be ideal if it worked.
    811         termios.tcsetattr(self.child_fd, termios.TCSANOW, attr)
    812 
    813     def read_nonblocking(self, size=1, timeout=-1):
    814 
    815         """This reads at most size characters from the child application. It
    816         includes a timeout. If the read does not complete within the timeout
    817         period then a TIMEOUT exception is raised. If the end of file is read
    818         then an EOF exception will be raised. If a log file was set using
    819         setlog() then all data will also be written to the log file.
    820 
    821         If timeout is None then the read may block indefinitely.
    822         If timeout is -1 then the self.timeout value is used. If timeout is 0
    823         then the child is polled and if there is no data immediately ready
    824         then this will raise a TIMEOUT exception.
    825 
    826         The timeout refers only to the amount of time to read at least one
    827         character. This is not effected by the 'size' parameter, so if you call
    828         read_nonblocking(size=100, timeout=30) and only one character is
    829         available right away then one character will be returned immediately.
    830         It will not wait for 30 seconds for another 99 characters to come in.
    831 
    832         This is a wrapper around os.read(). It uses select.select() to
    833         implement the timeout. """
    834 
    835         if self.closed:
    836             raise ValueError('I/O operation on closed file.')
    837 
    838         if timeout == -1:
    839             timeout = self.timeout
    840 
    841         # Note that some systems such as Solaris do not give an EOF when
    842         # the child dies. In fact, you can still try to read
    843         # from the child_fd -- it will block forever or until TIMEOUT.
    844         # For this case, I test isalive() before doing any reading.
    845         # If isalive() is false, then I pretend that this is the same as EOF.
    846         if not self.isalive():
    847             # timeout of 0 means "poll"
    848             r, w, e = self.__select([self.child_fd], [], [], 0)
    849             if not r:
    850                 self.flag_eof = True
    851                 raise EOF('End Of File (EOF). Braindead platform.')
    852         elif self.__irix_hack:
    853             # Irix takes a long time before it realizes a child was terminated.
    854             # FIXME So does this mean Irix systems are forced to always have
    855             # FIXME a 2 second delay when calling read_nonblocking? That sucks.
    856             r, w, e = self.__select([self.child_fd], [], [], 2)
    857             if not r and not self.isalive():
    858                 self.flag_eof = True
    859                 raise EOF('End Of File (EOF). Slow platform.')
    860 
    861         r, w, e = self.__select([self.child_fd], [], [], timeout)
    862 
    863         if not r:
    864             if not self.isalive():
    865                 # Some platforms, such as Irix, will claim that their
    866                 # processes are alive; timeout on the select; and
    867                 # then finally admit that they are not alive.
    868                 self.flag_eof = True
    869                 raise EOF('End of File (EOF). Very slow platform.')
    870             else:
    871                 raise TIMEOUT('Timeout exceeded.')
    872 
    873         if self.child_fd in r:
    874             try:
    875                 s = os.read(self.child_fd, size)
    876             except OSError as e:
    877                 # Linux does this
    878                 self.flag_eof = True
    879                 raise EOF('End Of File (EOF). Exception style platform.')
    880             if s == '':
    881                 # BSD style
    882                 self.flag_eof = True
    883                 raise EOF('End Of File (EOF). Empty string style platform.')
    884             if self.logfile is not None:
    885                 self.logfile.write(s)
    886                 self.logfile.flush()
    887             if self.logfile_read is not None:
    888                 self.logfile_read.write(s)
    889                 self.logfile_read.flush()
    890             return s
    891 
    892         raise ExceptionPexpect('Reached an unexpected state.')
    893 
    894     def read(self, size=-1):
    895 
    896         """This reads at most "size" bytes from the file (less if the read hits
    897         EOF before obtaining size bytes). If the size argument is negative or
    898         omitted, read all data until EOF is reached. The bytes are returned as
    899         a string object. An empty string is returned when EOF is encountered
    900         immediately. """
    901 
    902         if size == 0:
    903             return ''
    904         if size < 0:
    905             # delimiter default is EOF
    906             self.expect(self.delimiter)
    907             return self.before
    908 
    909         # I could have done this more directly by not using expect(), but
    910         # I deliberately decided to couple read() to expect() so that
    911         # I would catch any bugs early and ensure consistant behavior.
    912         # It's a little less efficient, but there is less for me to
    913         # worry about if I have to later modify read() or expect().
    914         # Note, it's OK if size==-1 in the regex. That just means it
    915         # will never match anything in which case we stop only on EOF.
    916         cre = re.compile('.{%d}' % size, re.DOTALL)
    917         # delimiter default is EOF
    918         index = self.expect([cre, self.delimiter])
    919         if index == 0:
    920             ### FIXME self.before should be ''. Should I assert this?
    921             return self.after
    922         return self.before
    923 
    924     def readline(self, size=-1):
    925 
    926         """This reads and returns one entire line. The newline at the end of
    927         line is returned as part of the string, unless the file ends without a
    928         newline. An empty string is returned if EOF is encountered immediately.
    929         This looks for a newline as a CR/LF pair (\\r\\n) even on UNIX because
    930         this is what the pseudotty device returns. So contrary to what you may
    931         expect you will receive newlines as \\r\\n.
    932 
    933         If the size argument is 0 then an empty string is returned. In all
    934         other cases the size argument is ignored, which is not standard
    935         behavior for a file-like object. """
    936 
    937         if size == 0:
    938             return ''
    939         # delimiter default is EOF
    940         index = self.expect(['\r\n', self.delimiter])
    941         if index == 0:
    942             return self.before + '\r\n'
    943         else:
    944             return self.before
    945 
    946     def __iter__(self):
    947 
    948         """This is to support iterators over a file-like object.
    949         """
    950 
    951         return self
    952 
    953     def __next__(self):
    954 
    955         """This is to support iterators over a file-like object.
    956         """
    957 
    958         result = self.readline()
    959         if result == "":
    960             raise StopIteration
    961         return result
    962 
    963     def readlines(self, sizehint=-1):
    964 
    965         """This reads until EOF using readline() and returns a list containing
    966         the lines thus read. The optional 'sizehint' argument is ignored. """
    967 
    968         lines = []
    969         while True:
    970             line = self.readline()
    971             if not line:
    972                 break
    973             lines.append(line)
    974         return lines
    975 
    976     def write(self, s):
    977 
    978         """This is similar to send() except that there is no return value.
    979         """
    980 
    981         self.send(s)
    982 
    983     def writelines(self, sequence):
    984 
    985         """This calls write() for each element in the sequence. The sequence
    986         can be any iterable object producing strings, typically a list of
    987         strings. This does not add line separators There is no return value.
    988         """
    989 
    990         for s in sequence:
    991             self.write(s)
    992 
    993     def send(self, s):
    994 
    995         """This sends a string to the child process. This returns the number of
    996         bytes written. If a log file was set then the data is also written to
    997         the log. """
    998 
    999         time.sleep(self.delaybeforesend)
   1000         if self.logfile is not None:
   1001             self.logfile.write(s)
   1002             self.logfile.flush()
   1003         if self.logfile_send is not None:
   1004             self.logfile_send.write(s)
   1005             self.logfile_send.flush()
   1006         c = os.write(self.child_fd, s.encode("utf-8"))
   1007         return c
   1008 
   1009     def sendline(self, s=''):
   1010 
   1011         """This is like send(), but it adds a linefeed (os.linesep). This
   1012         returns the number of bytes written. """
   1013 
   1014         n = self.send(s)
   1015         n = n + self.send(os.linesep)
   1016         return n
   1017 
   1018     def sendcontrol(self, char):
   1019 
   1020         """This sends a control character to the child such as Ctrl-C or
   1021         Ctrl-D. For example, to send a Ctrl-G (ASCII 7)::
   1022 
   1023             child.sendcontrol('g')
   1024 
   1025         See also, sendintr() and sendeof().
   1026         """
   1027 
   1028         char = char.lower()
   1029         a = ord(char)
   1030         if a >= 97 and a <= 122:
   1031             a = a - ord('a') + 1
   1032             return self.send(chr(a))
   1033         d = {'@': 0, '`': 0,
   1034             '[': 27, '{': 27,
   1035             '\\': 28, '|': 28,
   1036             ']': 29, '}': 29,
   1037             '^': 30, '~': 30,
   1038             '_': 31,
   1039             '?': 127}
   1040         if char not in d:
   1041             return 0
   1042         return self.send(chr(d[char]))
   1043 
   1044     def sendeof(self):
   1045 
   1046         """This sends an EOF to the child. This sends a character which causes
   1047         the pending parent output buffer to be sent to the waiting child
   1048         program without waiting for end-of-line. If it is the first character
   1049         of the line, the read() in the user program returns 0, which signifies
   1050         end-of-file. This means to work as expected a sendeof() has to be
   1051         called at the beginning of a line. This method does not send a newline.
   1052         It is the responsibility of the caller to ensure the eof is sent at the
   1053         beginning of a line. """
   1054 
   1055         ### Hmmm... how do I send an EOF?
   1056         ###C  if ((m = write(pty, *buf, p - *buf)) < 0)
   1057         ###C      return (errno == EWOULDBLOCK) ? n : -1;
   1058         #fd = sys.stdin.fileno()
   1059         #old = termios.tcgetattr(fd) # remember current state
   1060         #attr = termios.tcgetattr(fd)
   1061         #attr[3] = attr[3] | termios.ICANON # ICANON must be set to see EOF
   1062         #try: # use try/finally to ensure state gets restored
   1063         #    termios.tcsetattr(fd, termios.TCSADRAIN, attr)
   1064         #    if hasattr(termios, 'CEOF'):
   1065         #        os.write(self.child_fd, '%c' % termios.CEOF)
   1066         #    else:
   1067         #        # Silly platform does not define CEOF so assume CTRL-D
   1068         #        os.write(self.child_fd, '%c' % 4)
   1069         #finally: # restore state
   1070         #    termios.tcsetattr(fd, termios.TCSADRAIN, old)
   1071         if hasattr(termios, 'VEOF'):
   1072             char = termios.tcgetattr(self.child_fd)[6][termios.VEOF]
   1073         else:
   1074             # platform does not define VEOF so assume CTRL-D
   1075             char = chr(4)
   1076         self.send(char)
   1077 
   1078     def sendintr(self):
   1079 
   1080         """This sends a SIGINT to the child. It does not require
   1081         the SIGINT to be the first character on a line. """
   1082 
   1083         if hasattr(termios, 'VINTR'):
   1084             char = termios.tcgetattr(self.child_fd)[6][termios.VINTR]
   1085         else:
   1086             # platform does not define VINTR so assume CTRL-C
   1087             char = chr(3)
   1088         self.send(char)
   1089 
   1090     def eof(self):
   1091 
   1092         """This returns True if the EOF exception was ever raised.
   1093         """
   1094 
   1095         return self.flag_eof
   1096 
   1097     def terminate(self, force=False):
   1098 
   1099         """This forces a child process to terminate. It starts nicely with
   1100         SIGHUP and SIGINT. If "force" is True then moves onto SIGKILL. This
   1101         returns True if the child was terminated. This returns False if the
   1102         child could not be terminated. """
   1103 
   1104         if not self.isalive():
   1105             return True
   1106         try:
   1107             self.kill(signal.SIGHUP)
   1108             time.sleep(self.delayafterterminate)
   1109             if not self.isalive():
   1110                 return True
   1111             self.kill(signal.SIGCONT)
   1112             time.sleep(self.delayafterterminate)
   1113             if not self.isalive():
   1114                 return True
   1115             self.kill(signal.SIGINT)
   1116             time.sleep(self.delayafterterminate)
   1117             if not self.isalive():
   1118                 return True
   1119             if force:
   1120                 self.kill(signal.SIGKILL)
   1121                 time.sleep(self.delayafterterminate)
   1122                 if not self.isalive():
   1123                     return True
   1124                 else:
   1125                     return False
   1126             return False
   1127         except OSError as e:
   1128             # I think there are kernel timing issues that sometimes cause
   1129             # this to happen. I think isalive() reports True, but the
   1130             # process is dead to the kernel.
   1131             # Make one last attempt to see if the kernel is up to date.
   1132             time.sleep(self.delayafterterminate)
   1133             if not self.isalive():
   1134                 return True
   1135             else:
   1136                 return False
   1137 
   1138     def wait(self):
   1139 
   1140         """This waits until the child exits. This is a blocking call. This will
   1141         not read any data from the child, so this will block forever if the
   1142         child has unread output and has terminated. In other words, the child
   1143         may have printed output then called exit(), but, the child is
   1144         technically still alive until its output is read by the parent. """
   1145 
   1146         if self.isalive():
   1147             pid, status = os.waitpid(self.pid, 0)
   1148         else:
   1149             raise ExceptionPexpect('Cannot wait for dead child process.')
   1150         self.exitstatus = os.WEXITSTATUS(status)
   1151         if os.WIFEXITED(status):
   1152             self.status = status
   1153             self.exitstatus = os.WEXITSTATUS(status)
   1154             self.signalstatus = None
   1155             self.terminated = True
   1156         elif os.WIFSIGNALED(status):
   1157             self.status = status
   1158             self.exitstatus = None
   1159             self.signalstatus = os.WTERMSIG(status)
   1160             self.terminated = True
   1161         elif os.WIFSTOPPED(status):
   1162             # You can't call wait() on a child process in the stopped state.
   1163             raise ExceptionPexpect('Called wait() on a stopped child ' +
   1164                     'process. This is not supported. Is some other ' +
   1165                     'process attempting job control with our child pid?')
   1166         return self.exitstatus
   1167 
   1168     def isalive(self):
   1169 
   1170         """This tests if the child process is running or not. This is
   1171         non-blocking. If the child was terminated then this will read the
   1172         exitstatus or signalstatus of the child. This returns True if the child
   1173         process appears to be running or False if not. It can take literally
   1174         SECONDS for Solaris to return the right status. """
   1175 
   1176         if self.terminated:
   1177             return False
   1178 
   1179         if self.flag_eof:
   1180             # This is for Linux, which requires the blocking form
   1181             # of waitpid to # get status of a defunct process.
   1182             # This is super-lame. The flag_eof would have been set
   1183             # in read_nonblocking(), so this should be safe.
   1184             waitpid_options = 0
   1185         else:
   1186             waitpid_options = os.WNOHANG
   1187 
   1188         try:
   1189             pid, status = os.waitpid(self.pid, waitpid_options)
   1190         except OSError as e:
   1191             # No child processes
   1192             if e[0] == errno.ECHILD:
   1193                 raise ExceptionPexpect('isalive() encountered condition ' +
   1194                         'where "terminated" is 0, but there was no child ' +
   1195                         'process. Did someone else call waitpid() ' +
   1196                         'on our process?')
   1197             else:
   1198                 raise e
   1199 
   1200         # I have to do this twice for Solaris.
   1201         # I can't even believe that I figured this out...
   1202         # If waitpid() returns 0 it means that no child process
   1203         # wishes to report, and the value of status is undefined.
   1204         if pid == 0:
   1205             try:
   1206                 ### os.WNOHANG) # Solaris!
   1207                 pid, status = os.waitpid(self.pid, waitpid_options)
   1208             except OSError as e:
   1209                 # This should never happen...
   1210                 if e[0] == errno.ECHILD:
   1211                     raise ExceptionPexpect('isalive() encountered condition ' +
   1212                             'that should never happen. There was no child ' +
   1213                             'process. Did someone else call waitpid() ' +
   1214                             'on our process?')
   1215                 else:
   1216                     raise e
   1217 
   1218             # If pid is still 0 after two calls to waitpid() then the process
   1219             # really is alive. This seems to work on all platforms, except for
   1220             # Irix which seems to require a blocking call on waitpid or select,
   1221             # so I let read_nonblocking take care of this situation
   1222             # (unfortunately, this requires waiting through the timeout).
   1223             if pid == 0:
   1224                 return True
   1225 
   1226         if pid == 0:
   1227             return True
   1228 
   1229         if os.WIFEXITED(status):
   1230             self.status = status
   1231             self.exitstatus = os.WEXITSTATUS(status)
   1232             self.signalstatus = None
   1233             self.terminated = True
   1234         elif os.WIFSIGNALED(status):
   1235             self.status = status
   1236             self.exitstatus = None
   1237             self.signalstatus = os.WTERMSIG(status)
   1238             self.terminated = True
   1239         elif os.WIFSTOPPED(status):
   1240             raise ExceptionPexpect('isalive() encountered condition ' +
   1241                     'where child process is stopped. This is not ' +
   1242                     'supported. Is some other process attempting ' +
   1243                     'job control with our child pid?')
   1244         return False
   1245 
   1246     def kill(self, sig):
   1247 
   1248         """This sends the given signal to the child application. In keeping
   1249         with UNIX tradition it has a misleading name. It does not necessarily
   1250         kill the child unless you send the right signal. """
   1251 
   1252         # Same as os.kill, but the pid is given for you.
   1253         if self.isalive():
   1254             os.kill(self.pid, sig)
   1255 
   1256     def compile_pattern_list(self, patterns):
   1257 
   1258         """This compiles a pattern-string or a list of pattern-strings.
   1259         Patterns must be a StringType, EOF, TIMEOUT, SRE_Pattern, or a list of
   1260         those. Patterns may also be None which results in an empty list (you
   1261         might do this if waiting for an EOF or TIMEOUT condition without
   1262         expecting any pattern).
   1263 
   1264         This is used by expect() when calling expect_list(). Thus expect() is
   1265         nothing more than::
   1266 
   1267              cpl = self.compile_pattern_list(pl)
   1268              return self.expect_list(cpl, timeout)
   1269 
   1270         If you are using expect() within a loop it may be more
   1271         efficient to compile the patterns first and then call expect_list().
   1272         This avoid calls in a loop to compile_pattern_list()::
   1273 
   1274              cpl = self.compile_pattern_list(my_pattern)
   1275              while some_condition:
   1276                 ...
   1277                 i = self.expect_list(clp, timeout)
   1278                 ...
   1279         """
   1280 
   1281         if patterns is None:
   1282             return []
   1283         if not isinstance(patterns, list):
   1284             patterns = [patterns]
   1285 
   1286         # Allow dot to match \n
   1287         compile_flags = re.DOTALL
   1288         if self.ignorecase:
   1289             compile_flags = compile_flags | re.IGNORECASE
   1290         compiled_pattern_list = []
   1291         for p in patterns:
   1292             if type(p) in types.StringTypes:
   1293                 compiled_pattern_list.append(re.compile(p, compile_flags))
   1294             elif p is EOF:
   1295                 compiled_pattern_list.append(EOF)
   1296             elif p is TIMEOUT:
   1297                 compiled_pattern_list.append(TIMEOUT)
   1298             elif isinstance(p, type(re.compile(''))):
   1299                 compiled_pattern_list.append(p)
   1300             else:
   1301                 raise TypeError('Argument must be one of StringTypes, ' +
   1302                         'EOF, TIMEOUT, SRE_Pattern, or a list of those ' +
   1303                         'type. %s' % str(type(p)))
   1304 
   1305         return compiled_pattern_list
   1306 
   1307     def expect(self, pattern, timeout=-1, searchwindowsize=-1):
   1308 
   1309         """This seeks through the stream until a pattern is matched. The
   1310         pattern is overloaded and may take several types. The pattern can be a
   1311         StringType, EOF, a compiled re, or a list of any of those types.
   1312         Strings will be compiled to re types. This returns the index into the
   1313         pattern list. If the pattern was not a list this returns index 0 on a
   1314         successful match. This may raise exceptions for EOF or TIMEOUT. To
   1315         avoid the EOF or TIMEOUT exceptions add EOF or TIMEOUT to the pattern
   1316         list. That will cause expect to match an EOF or TIMEOUT condition
   1317         instead of raising an exception.
   1318 
   1319         If you pass a list of patterns and more than one matches, the first
   1320         match in the stream is chosen. If more than one pattern matches at that
   1321         point, the leftmost in the pattern list is chosen. For example::
   1322 
   1323             # the input is 'foobar'
   1324             index = p.expect(['bar', 'foo', 'foobar'])
   1325             # returns 1('foo') even though 'foobar' is a "better" match
   1326 
   1327         Please note, however, that buffering can affect this behavior, since
   1328         input arrives in unpredictable chunks. For example::
   1329 
   1330             # the input is 'foobar'
   1331             index = p.expect(['foobar', 'foo'])
   1332             # returns 0('foobar') if all input is available at once,
   1333             # but returs 1('foo') if parts of the final 'bar' arrive late
   1334 
   1335         After a match is found the instance attributes 'before', 'after' and
   1336         'match' will be set. You can see all the data read before the match in
   1337         'before'. You can see the data that was matched in 'after'. The
   1338         re.MatchObject used in the re match will be in 'match'. If an error
   1339         occurred then 'before' will be set to all the data read so far and
   1340         'after' and 'match' will be None.
   1341 
   1342         If timeout is -1 then timeout will be set to the self.timeout value.
   1343 
   1344         A list entry may be EOF or TIMEOUT instead of a string. This will
   1345         catch these exceptions and return the index of the list entry instead
   1346         of raising the exception. The attribute 'after' will be set to the
   1347         exception type. The attribute 'match' will be None. This allows you to
   1348         write code like this::
   1349 
   1350                 index = p.expect(['good', 'bad', pexpect.EOF, pexpect.TIMEOUT])
   1351                 if index == 0:
   1352                     do_something()
   1353                 elif index == 1:
   1354                     do_something_else()
   1355                 elif index == 2:
   1356                     do_some_other_thing()
   1357                 elif index == 3:
   1358                     do_something_completely_different()
   1359 
   1360         instead of code like this::
   1361 
   1362                 try:
   1363                     index = p.expect(['good', 'bad'])
   1364                     if index == 0:
   1365                         do_something()
   1366                     elif index == 1:
   1367                         do_something_else()
   1368                 except EOF:
   1369                     do_some_other_thing()
   1370                 except TIMEOUT:
   1371                     do_something_completely_different()
   1372 
   1373         These two forms are equivalent. It all depends on what you want. You
   1374         can also just expect the EOF if you are waiting for all output of a
   1375         child to finish. For example::
   1376 
   1377                 p = pexpect.spawn('/bin/ls')
   1378                 p.expect(pexpect.EOF)
   1379                 print p.before
   1380 
   1381         If you are trying to optimize for speed then see expect_list().
   1382         """
   1383 
   1384         compiled_pattern_list = self.compile_pattern_list(pattern)
   1385         return self.expect_list(compiled_pattern_list,
   1386                 timeout, searchwindowsize)
   1387 
   1388     def expect_list(self, pattern_list, timeout=-1, searchwindowsize=-1):
   1389 
   1390         """This takes a list of compiled regular expressions and returns the
   1391         index into the pattern_list that matched the child output. The list may
   1392         also contain EOF or TIMEOUT(which are not compiled regular
   1393         expressions). This method is similar to the expect() method except that
   1394         expect_list() does not recompile the pattern list on every call. This
   1395         may help if you are trying to optimize for speed, otherwise just use
   1396         the expect() method.  This is called by expect(). If timeout==-1 then
   1397         the self.timeout value is used. If searchwindowsize==-1 then the
   1398         self.searchwindowsize value is used. """
   1399 
   1400         return self.expect_loop(searcher_re(pattern_list),
   1401                 timeout, searchwindowsize)
   1402 
   1403     def expect_exact(self, pattern_list, timeout=-1, searchwindowsize=-1):
   1404 
   1405         """This is similar to expect(), but uses plain string matching instead
   1406         of compiled regular expressions in 'pattern_list'. The 'pattern_list'
   1407         may be a string; a list or other sequence of strings; or TIMEOUT and
   1408         EOF.
   1409 
   1410         This call might be faster than expect() for two reasons: string
   1411         searching is faster than RE matching and it is possible to limit the
   1412         search to just the end of the input buffer.
   1413 
   1414         This method is also useful when you don't want to have to worry about
   1415         escaping regular expression characters that you want to match."""
   1416 
   1417         if (type(pattern_list) in types.StringTypes or
   1418             pattern_list in (TIMEOUT, EOF)):
   1419             pattern_list = [pattern_list]
   1420         return self.expect_loop(searcher_string(pattern_list),
   1421                 timeout, searchwindowsize)
   1422 
   1423     def expect_loop(self, searcher, timeout=-1, searchwindowsize=-1):
   1424 
   1425         """This is the common loop used inside expect. The 'searcher' should be
   1426         an instance of searcher_re or searcher_string, which describes how and
   1427         what to search for in the input.
   1428 
   1429         See expect() for other arguments, return value and exceptions. """
   1430 
   1431         self.searcher = searcher
   1432 
   1433         if timeout == -1:
   1434             timeout = self.timeout
   1435         if timeout is not None:
   1436             end_time = time.time() + timeout
   1437         if searchwindowsize == -1:
   1438             searchwindowsize = self.searchwindowsize
   1439 
   1440         try:
   1441             incoming = self.buffer
   1442             freshlen = len(incoming)
   1443             while True:
   1444                 # Keep reading until exception or return.
   1445                 index = searcher.search(incoming, freshlen, searchwindowsize)
   1446                 if index >= 0:
   1447                     self.buffer = incoming[searcher.end:]
   1448                     self.before = incoming[: searcher.start]
   1449                     self.after = incoming[searcher.start: searcher.end]
   1450                     self.match = searcher.match
   1451                     self.match_index = index
   1452                     return self.match_index
   1453                 # No match at this point
   1454                 if timeout < 0 and timeout is not None:
   1455                     raise TIMEOUT('Timeout exceeded in expect_any().')
   1456                 # Still have time left, so read more data
   1457                 c = self.read_nonblocking(self.maxread, timeout)
   1458                 freshlen = len(c)
   1459                 time.sleep(0.0001)
   1460                 incoming = incoming + c
   1461                 if timeout is not None:
   1462                     timeout = end_time - time.time()
   1463         except EOF as e:
   1464             self.buffer = ''
   1465             self.before = incoming
   1466             self.after = EOF
   1467             index = searcher.eof_index
   1468             if index >= 0:
   1469                 self.match = EOF
   1470                 self.match_index = index
   1471                 return self.match_index
   1472             else:
   1473                 self.match = None
   1474                 self.match_index = None
   1475                 raise EOF(str(e) + '\n' + str(self))
   1476         except TIMEOUT as e:
   1477             self.buffer = incoming
   1478             self.before = incoming
   1479             self.after = TIMEOUT
   1480             index = searcher.timeout_index
   1481             if index >= 0:
   1482                 self.match = TIMEOUT
   1483                 self.match_index = index
   1484                 return self.match_index
   1485             else:
   1486                 self.match = None
   1487                 self.match_index = None
   1488                 raise TIMEOUT(str(e) + '\n' + str(self))
   1489         except:
   1490             self.before = incoming
   1491             self.after = None
   1492             self.match = None
   1493             self.match_index = None
   1494             raise
   1495 
   1496     def getwinsize(self):
   1497 
   1498         """This returns the terminal window size of the child tty. The return
   1499         value is a tuple of (rows, cols). """
   1500 
   1501         TIOCGWINSZ = getattr(termios, 'TIOCGWINSZ', 1074295912)
   1502         s = struct.pack('HHHH', 0, 0, 0, 0)
   1503         x = fcntl.ioctl(self.fileno(), TIOCGWINSZ, s)
   1504         return struct.unpack('HHHH', x)[0:2]
   1505 
   1506     def setwinsize(self, rows, cols):
   1507 
   1508         """This sets the terminal window size of the child tty. This will cause
   1509         a SIGWINCH signal to be sent to the child. This does not change the
   1510         physical window size. It changes the size reported to TTY-aware
   1511         applications like vi or curses -- applications that respond to the
   1512         SIGWINCH signal. """
   1513 
   1514         # Check for buggy platforms. Some Python versions on some platforms
   1515         # (notably OSF1 Alpha and RedHat 7.1) truncate the value for
   1516         # termios.TIOCSWINSZ. It is not clear why this happens.
   1517         # These platforms don't seem to handle the signed int very well;
   1518         # yet other platforms like OpenBSD have a large negative value for
   1519         # TIOCSWINSZ and they don't have a truncate problem.
   1520         # Newer versions of Linux have totally different values for TIOCSWINSZ.
   1521         # Note that this fix is a hack.
   1522         TIOCSWINSZ = getattr(termios, 'TIOCSWINSZ', -2146929561)
   1523         if TIOCSWINSZ == 2148037735:
   1524             # Same bits, but with sign.
   1525             TIOCSWINSZ = -2146929561
   1526         # Note, assume ws_xpixel and ws_ypixel are zero.
   1527         s = struct.pack('HHHH', rows, cols, 0, 0)
   1528         fcntl.ioctl(self.fileno(), TIOCSWINSZ, s)
   1529 
   1530     def interact(self, escape_character=chr(29),
   1531             input_filter=None, output_filter=None):
   1532 
   1533         """This gives control of the child process to the interactive user (the
   1534         human at the keyboard). Keystrokes are sent to the child process, and
   1535         the stdout and stderr output of the child process is printed. This
   1536         simply echos the child stdout and child stderr to the real stdout and
   1537         it echos the real stdin to the child stdin. When the user types the
   1538         escape_character this method will stop. The default for
   1539         escape_character is ^]. This should not be confused with ASCII 27 --
   1540         the ESC character. ASCII 29 was chosen for historical merit because
   1541         this is the character used by 'telnet' as the escape character. The
   1542         escape_character will not be sent to the child process.
   1543 
   1544         You may pass in optional input and output filter functions. These
   1545         functions should take a string and return a string. The output_filter
   1546         will be passed all the output from the child process. The input_filter
   1547         will be passed all the keyboard input from the user. The input_filter
   1548         is run BEFORE the check for the escape_character.
   1549 
   1550         Note that if you change the window size of the parent the SIGWINCH
   1551         signal will not be passed through to the child. If you want the child
   1552         window size to change when the parent's window size changes then do
   1553         something like the following example::
   1554 
   1555             import pexpect, struct, fcntl, termios, signal, sys
   1556             def sigwinch_passthrough (sig, data):
   1557                 s = struct.pack("HHHH", 0, 0, 0, 0)
   1558                 a = struct.unpack('hhhh', fcntl.ioctl(sys.stdout.fileno(),
   1559                     termios.TIOCGWINSZ , s))
   1560                 global p
   1561                 p.setwinsize(a[0],a[1])
   1562             # Note this 'p' global and used in sigwinch_passthrough.
   1563             p = pexpect.spawn('/bin/bash')
   1564             signal.signal(signal.SIGWINCH, sigwinch_passthrough)
   1565             p.interact()
   1566         """
   1567 
   1568         # Flush the buffer.
   1569         self.stdout.write(self.buffer)
   1570         self.stdout.flush()
   1571         self.buffer = ''
   1572         mode = tty.tcgetattr(self.STDIN_FILENO)
   1573         tty.setraw(self.STDIN_FILENO)
   1574         try:
   1575             self.__interact_copy(escape_character, input_filter, output_filter)
   1576         finally:
   1577             tty.tcsetattr(self.STDIN_FILENO, tty.TCSAFLUSH, mode)
   1578 
   1579     def __interact_writen(self, fd, data):
   1580 
   1581         """This is used by the interact() method.
   1582         """
   1583 
   1584         while data != '' and self.isalive():
   1585             n = os.write(fd, data)
   1586             data = data[n:]
   1587 
   1588     def __interact_read(self, fd):
   1589 
   1590         """This is used by the interact() method.
   1591         """
   1592 
   1593         return os.read(fd, 1000)
   1594 
   1595     def __interact_copy(self, escape_character=None,
   1596             input_filter=None, output_filter=None):
   1597 
   1598         """This is used by the interact() method.
   1599         """
   1600 
   1601         while self.isalive():
   1602             r, w, e = self.__select([self.child_fd, self.STDIN_FILENO], [], [])
   1603             if self.child_fd in r:
   1604                 data = self.__interact_read(self.child_fd)
   1605                 if output_filter:
   1606                     data = output_filter(data)
   1607                 if self.logfile is not None:
   1608                     self.logfile.write(data)
   1609                     self.logfile.flush()
   1610                 os.write(self.STDOUT_FILENO, data)
   1611             if self.STDIN_FILENO in r:
   1612                 data = self.__interact_read(self.STDIN_FILENO)
   1613                 if input_filter:
   1614                     data = input_filter(data)
   1615                 i = data.rfind(escape_character)
   1616                 if i != -1:
   1617                     data = data[:i]
   1618                     self.__interact_writen(self.child_fd, data)
   1619                     break
   1620                 self.__interact_writen(self.child_fd, data)
   1621 
   1622     def __select(self, iwtd, owtd, ewtd, timeout=None):
   1623 
   1624         """This is a wrapper around select.select() that ignores signals. If
   1625         select.select raises a select.error exception and errno is an EINTR
   1626         error then it is ignored. Mainly this is used to ignore sigwinch
   1627         (terminal resize). """
   1628 
   1629         # if select() is interrupted by a signal (errno==EINTR) then
   1630         # we loop back and enter the select() again.
   1631         if timeout is not None:
   1632             end_time = time.time() + timeout
   1633         while True:
   1634             try:
   1635                 return select.select(iwtd, owtd, ewtd, timeout)
   1636             except select.error as e:
   1637                 if e[0] == errno.EINTR:
   1638                     # if we loop back we have to subtract the
   1639                     # amount of time we already waited.
   1640                     if timeout is not None:
   1641                         timeout = end_time - time.time()
   1642                         if timeout < 0:
   1643                             return([], [], [])
   1644                 else:
   1645                     # something else caused the select.error, so
   1646                     # this actually is an exception.
   1647                     raise
   1648 
   1649 ##############################################################################
   1650 # The following methods are no longer supported or allowed.
   1651 
   1652     def setmaxread(self, maxread):
   1653 
   1654         """This method is no longer supported or allowed. I don't like getters
   1655         and setters without a good reason. """
   1656 
   1657         raise ExceptionPexpect('This method is no longer supported ' +
   1658                 'or allowed. Just assign a value to the ' +
   1659                 'maxread member variable.')
   1660 
   1661     def setlog(self, fileobject):
   1662 
   1663         """This method is no longer supported or allowed.
   1664         """
   1665 
   1666         raise ExceptionPexpect('This method is no longer supported ' +
   1667                 'or allowed. Just assign a value to the logfile ' +
   1668                 'member variable.')
   1669 
   1670 ##############################################################################
   1671 # End of spawn class
   1672 ##############################################################################
   1673 
   1674 
   1675 class searcher_string(object):
   1676 
   1677     """This is a plain string search helper for the spawn.expect_any() method.
   1678     This helper class is for speed. For more powerful regex patterns
   1679     see the helper class, searcher_re.
   1680 
   1681     Attributes:
   1682 
   1683         eof_index     - index of EOF, or -1
   1684         timeout_index - index of TIMEOUT, or -1
   1685 
   1686     After a successful match by the search() method the following attributes
   1687     are available:
   1688 
   1689         start - index into the buffer, first byte of match
   1690         end   - index into the buffer, first byte after match
   1691         match - the matching string itself
   1692 
   1693     """
   1694 
   1695     def __init__(self, strings):
   1696 
   1697         """This creates an instance of searcher_string. This argument 'strings'
   1698         may be a list; a sequence of strings; or the EOF or TIMEOUT types. """
   1699 
   1700         self.eof_index = -1
   1701         self.timeout_index = -1
   1702         self._strings = []
   1703         for n, s in zip(list(range(len(strings))), strings):
   1704             if s is EOF:
   1705                 self.eof_index = n
   1706                 continue
   1707             if s is TIMEOUT:
   1708                 self.timeout_index = n
   1709                 continue
   1710             self._strings.append((n, s))
   1711 
   1712     def __str__(self):
   1713 
   1714         """This returns a human-readable string that represents the state of
   1715         the object."""
   1716 
   1717         ss = [(ns[0], '    %d: "%s"' % ns) for ns in self._strings]
   1718         ss.append((-1, 'searcher_string:'))
   1719         if self.eof_index >= 0:
   1720             ss.append((self.eof_index, '    %d: EOF' % self.eof_index))
   1721         if self.timeout_index >= 0:
   1722             ss.append((self.timeout_index,
   1723                 '    %d: TIMEOUT' % self.timeout_index))
   1724         ss.sort()
   1725         ss = zip(*ss)[1]
   1726         return '\n'.join(ss)
   1727 
   1728     def search(self, buffer, freshlen, searchwindowsize=None):
   1729 
   1730         """This searches 'buffer' for the first occurence of one of the search
   1731         strings.  'freshlen' must indicate the number of bytes at the end of
   1732         'buffer' which have not been searched before. It helps to avoid
   1733         searching the same, possibly big, buffer over and over again.
   1734 
   1735         See class spawn for the 'searchwindowsize' argument.
   1736 
   1737         If there is a match this returns the index of that string, and sets
   1738         'start', 'end' and 'match'. Otherwise, this returns -1. """
   1739 
   1740         absurd_match = len(buffer)
   1741         first_match = absurd_match
   1742 
   1743         # 'freshlen' helps a lot here. Further optimizations could
   1744         # possibly include:
   1745         #
   1746         # using something like the Boyer-Moore Fast String Searching
   1747         # Algorithm; pre-compiling the search through a list of
   1748         # strings into something that can scan the input once to
   1749         # search for all N strings; realize that if we search for
   1750         # ['bar', 'baz'] and the input is '...foo' we need not bother
   1751         # rescanning until we've read three more bytes.
   1752         #
   1753         # Sadly, I don't know enough about this interesting topic. /grahn
   1754 
   1755         for index, s in self._strings:
   1756             if searchwindowsize is None:
   1757                 # the match, if any, can only be in the fresh data,
   1758                 # or at the very end of the old data
   1759                 offset = -(freshlen + len(s))
   1760             else:
   1761                 # better obey searchwindowsize
   1762                 offset = -searchwindowsize
   1763             n = buffer.find(s, offset)
   1764             if n >= 0 and n < first_match:
   1765                 first_match = n
   1766                 best_index, best_match = index, s
   1767         if first_match == absurd_match:
   1768             return -1
   1769         self.match = best_match
   1770         self.start = first_match
   1771         self.end = self.start + len(self.match)
   1772         return best_index
   1773 
   1774 
   1775 class searcher_re(object):
   1776 
   1777     """This is regular expression string search helper for the
   1778     spawn.expect_any() method. This helper class is for powerful
   1779     pattern matching. For speed, see the helper class, searcher_string.
   1780 
   1781     Attributes:
   1782 
   1783         eof_index     - index of EOF, or -1
   1784         timeout_index - index of TIMEOUT, or -1
   1785 
   1786     After a successful match by the search() method the following attributes
   1787     are available:
   1788 
   1789         start - index into the buffer, first byte of match
   1790         end   - index into the buffer, first byte after match
   1791         match - the re.match object returned by a succesful re.search
   1792 
   1793     """
   1794 
   1795     def __init__(self, patterns):
   1796 
   1797         """This creates an instance that searches for 'patterns' Where
   1798         'patterns' may be a list or other sequence of compiled regular
   1799         expressions, or the EOF or TIMEOUT types."""
   1800 
   1801         self.eof_index = -1
   1802         self.timeout_index = -1
   1803         self._searches = []
   1804         for n, s in zip(list(range(len(patterns))), patterns):
   1805             if s is EOF:
   1806                 self.eof_index = n
   1807                 continue
   1808             if s is TIMEOUT:
   1809                 self.timeout_index = n
   1810                 continue
   1811             self._searches.append((n, s))
   1812 
   1813     def __str__(self):
   1814 
   1815         """This returns a human-readable string that represents the state of
   1816         the object."""
   1817 
   1818         ss = [(n, '    %d: re.compile("%s")' %
   1819             (n, str(s.pattern))) for n, s in self._searches]
   1820         ss.append((-1, 'searcher_re:'))
   1821         if self.eof_index >= 0:
   1822             ss.append((self.eof_index, '    %d: EOF' % self.eof_index))
   1823         if self.timeout_index >= 0:
   1824             ss.append((self.timeout_index, '    %d: TIMEOUT' %
   1825                 self.timeout_index))
   1826         ss.sort()
   1827         ss = zip(*ss)[1]
   1828         return '\n'.join(ss)
   1829 
   1830     def search(self, buffer, freshlen, searchwindowsize=None):
   1831 
   1832         """This searches 'buffer' for the first occurence of one of the regular
   1833         expressions. 'freshlen' must indicate the number of bytes at the end of
   1834         'buffer' which have not been searched before.
   1835 
   1836         See class spawn for the 'searchwindowsize' argument.
   1837 
   1838         If there is a match this returns the index of that string, and sets
   1839         'start', 'end' and 'match'. Otherwise, returns -1."""
   1840 
   1841         absurd_match = len(buffer)
   1842         first_match = absurd_match
   1843         # 'freshlen' doesn't help here -- we cannot predict the
   1844         # length of a match, and the re module provides no help.
   1845         if searchwindowsize is None:
   1846             searchstart = 0
   1847         else:
   1848             searchstart = max(0, len(buffer) - searchwindowsize)
   1849         for index, s in self._searches:
   1850             match = s.search(buffer, searchstart)
   1851             if match is None:
   1852                 continue
   1853             n = match.start()
   1854             if n < first_match:
   1855                 first_match = n
   1856                 the_match = match
   1857                 best_index = index
   1858         if first_match == absurd_match:
   1859             return -1
   1860         self.start = first_match
   1861         self.match = the_match
   1862         self.end = self.match.end()
   1863         return best_index
   1864 
   1865 
   1866 def which(filename):
   1867 
   1868     """This takes a given filename; tries to find it in the environment path;
   1869     then checks if it is executable. This returns the full path to the filename
   1870     if found and executable. Otherwise this returns None."""
   1871 
   1872     # Special case where filename contains an explicit path.
   1873     if os.path.dirname(filename) != '':
   1874         if os.access(filename, os.X_OK):
   1875             return filename
   1876     if 'PATH' not in os.environ or os.environ['PATH'] == '':
   1877         p = os.defpath
   1878     else:
   1879         p = os.environ['PATH']
   1880     pathlist = string.split(p, os.pathsep)
   1881     for path in pathlist:
   1882         ff = os.path.join(path, filename)
   1883         if os.access(ff, os.X_OK):
   1884             return ff
   1885     return None
   1886 
   1887 
   1888 def split_command_line(command_line):
   1889 
   1890     """This splits a command line into a list of arguments. It splits arguments
   1891     on spaces, but handles embedded quotes, doublequotes, and escaped
   1892     characters. It's impossible to do this with a regular expression, so I
   1893     wrote a little state machine to parse the command line. """
   1894 
   1895     arg_list = []
   1896     arg = ''
   1897 
   1898     # Constants to name the states we can be in.
   1899     state_basic = 0
   1900     state_esc = 1
   1901     state_singlequote = 2
   1902     state_doublequote = 3
   1903     # The state when consuming whitespace between commands.
   1904     state_whitespace = 4
   1905     state = state_basic
   1906 
   1907     for c in command_line:
   1908         if state == state_basic or state == state_whitespace:
   1909             if c == '\\':
   1910                 # Escape the next character
   1911                 state = state_esc
   1912             elif c == r"'":
   1913                 # Handle single quote
   1914                 state = state_singlequote
   1915             elif c == r'"':
   1916                 # Handle double quote
   1917                 state = state_doublequote
   1918             elif c.isspace():
   1919                 # Add arg to arg_list if we aren't in the middle of whitespace.
   1920                 if state == state_whitespace:
   1921                     # Do nothing.
   1922                     None
   1923                 else:
   1924                     arg_list.append(arg)
   1925                     arg = ''
   1926                     state = state_whitespace
   1927             else:
   1928                 arg = arg + c
   1929                 state = state_basic
   1930         elif state == state_esc:
   1931             arg = arg + c
   1932             state = state_basic
   1933         elif state == state_singlequote:
   1934             if c == r"'":
   1935                 state = state_basic
   1936             else:
   1937                 arg = arg + c
   1938         elif state == state_doublequote:
   1939             if c == r'"':
   1940                 state = state_basic
   1941             else:
   1942                 arg = arg + c
   1943 
   1944     if arg != '':
   1945         arg_list.append(arg)
   1946     return arg_list
   1947 
   1948 # vi:set sr et ts=4 sw=4 ft=python :
   1949