o !^@sjdZddlZddlZddlZddlZejddkZereZ dZ dZ Gddde Z d d dZd d d ZdS)zEGeneric wrapper for read-eval-print-loops, a.k.a. interactive shells Nz[PEXPECT_PROMPT>z[PEXPECT_PROMPT+c@s<eZdZdZeedfddZddZd d d Zd d d Z dS) REPLWrapperaWrapper for a REPL. :param cmd_or_spawn: This can either be an instance of :class:`pexpect.spawn` in which a REPL has already been started, or a str command to start a new REPL process. :param str orig_prompt: The prompt to expect at first. :param str prompt_change: A command to change the prompt to something more unique. If this is ``None``, the prompt will not be changed. This will be formatted with the new and continuation prompts as positional parameters, so you can use ``{}`` style formatting to insert them into the command. :param str new_prompt: The more unique prompt to expect after the change. :param str extra_init_cmd: Commands to do extra initialisation, such as disabling pagers. NcCst|trtj|ddd|_n||_|jjr!|jd|j|dur)||_n | || ||||_||_ | |durH| |dSdS)NFutf-8echoencoding) isinstance basestringpexpectspawnchildrsetecho waitnoechoprompt set_promptformatcontinuation_prompt_expect_prompt run_command)self cmd_or_spawn orig_prompt prompt_change new_promptrextra_init_cmdr2/usr/lib/python3/dist-packages/pexpect/replwrap.py__init__!s"    zREPLWrapper.__init__cCs|j||j|dS)N)r expectsendline)rrrrrrr<s zREPLWrapper.set_promptFcCs|jj|j|jg||dS)N)timeoutasync_)r expect_exactrr)rr!r"rrrr@szREPLWrapper._expect_promptcCs|}|dr|d|std|r"ddlm}||||Sg}|j|d|ddD]}|j|d||jj |j|q2|j|ddkrc|j t j |jddtd |d ||jj gS) a0Send a command to the REPL, wait for and return output. :param str command: The command to send. Trailing newlines are not needed. This should be a complete block of input that will trigger execution; if a continuation prompt is found after sending input, :exc:`ValueError` will be raised. :param int timeout: How long to wait for the next prompt. -1 means the default from the :class:`pexpect.spawn` object (default 30 seconds). None means to wait indefinitely. :param bool async_: On Python 3.4, or Python 3.3 with asyncio installed, passing ``async_=True`` will make this return an :mod:`asyncio` Future, which you can yield from to get the same result that this method would normally give directly.  zNo command was given)repl_run_command_asyncrN)r!z2Continuation prompt found - input was incomplete: ) splitlinesendswithappend ValueError_asyncr'r rrbeforekillsignalSIGINTjoin)rcommandr!r"cmdlinesr'reslinerrrrDs*      zREPLWrapper.run_command)r F) __name__ __module__ __qualname____doc__PEXPECT_PROMPTPEXPECT_CONTINUATION_PROMPTrrrrrrrrrs  rpythoncCs t|ddS)z>Start a Python shell and return a :class:`REPLWrapper` object.z>>> z(import sys; sys.ps1={0!r}; sys.ps2={1!r})r)r2rrrr<os bashcCstjtjtd}tj|d|gddd}tdddtdd}tdddtdd}d ||}t |d |d d S) zs ^