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