Changelog
### 4.7
```
* The :meth:`.pxssh.login` method now no longer requires a username if an ssh
config is provided and will raise an error if neither are provided.
(:ghpull:`562`).
* The :meth:`.pxssh.login` method now supports providing your own ``ssh``
command via the ``cmd`` parameter.
(:ghpull:`528`) (:ghpull:`563`).
* :class:`.pxssh` now supports the ``use_poll`` parameter which is passed into :meth:`.pexpect.spawn`
(:ghpull:`542`).
* Minor bug fix with ``ssh_config``.
(:ghpull:`498`).
* :meth:`.replwrap.run_command` now has async support via an ``async_`` parameter.
(:ghpull:`501`).
* :meth:`.pexpect.spawn` will now read additional bytes if able up to a buffer limit.
(:ghpull:`304`).
```
### 4.6
```
* The :meth:`.pxssh.login` method now supports an ``ssh_config`` parameter,
which can be used to specify a file path to an SSH config file
(:ghpull:`490`).
* Improved compatability for the ``crlf`` parameter of :class:`~.PopenSpawn`
(:ghpull:`493`)
* Fixed an issue in read timeout handling when using :class:`~.spawn` and
:class:`~.fdspawn` with the ``use_poll`` parameter (:ghpull:`492`).
```
### 4.5
```
* :class:`~.spawn` and :class:`~.fdspawn` now have a ``use_poll`` parameter.
If this is True, they will use :func:`select.poll` instead of :func:`select.select`.
``poll()`` allows file descriptors above 1024, but it must be explicitly
enabled due to compatibility concerns (:ghpull:`474`).
* The :meth:`.pxssh.login` method has several new and changed options:
* The option ``password_regex`` allows changing
the password prompt regex, for servers that include ``password:`` in a banner
before reaching a prompt (:ghpull:`468`).
* :meth:`~.pxssh.login` now allows for setting up SSH tunnels to be requested once
logged in to the remote server. This option is ``ssh_tunnels`` (:ghpull:`473`).
The structure should be like this::
{
'local': ['2424:localhost:22'], Local SSH tunnels
'remote': ['2525:localhost:22'], Remote SSH tunnels
'dynamic': [8888], Dynamic/SOCKS tunnels
}
* The option ``spawn_local_ssh=False`` allows subsequent logins from the
remote session and treats the session as if it was local (:ghpull:`472`).
* Setting ``sync_original_prompt=False`` will prevent changing the prompt to
something unique, in case the remote server is sensitive to new lines at login
(:ghpull:`468`).
* If ``ssh_key=True`` is passed, the SSH client forces forwarding the authentication
agent to the remote server instead of providing a key (:ghpull:`473`).
```
### 4.4
```
* :class:`~.PopenSpawn` now has a ``preexec_fn`` parameter, like :class:`~.spawn`
and :class:`subprocess.Popen`, for a function to be called in the child
process before executing the new command. Like in ``Popen``, this works only
in POSIX, and can cause issues if your application also uses threads
(:ghpull:`460`).
* Significant performance improvements when processing large amounts of data
(:ghpull:`464`).
* Ensure that ``spawn.closed`` gets set by :meth:`~.spawn.close`, and improve
an example for passing ``SIGWINCH`` through to a child process (:ghpull:`466`).
```
### 4.3.1
```
* When launching bash for :mod:`pexpect.replwrap`, load the system ``bashrc``
from a couple of different common locations (:ghpull:`457`), and then unset
the ``PROMPT_COMMAND`` environment variable, which can interfere with the
prompt we're expecting (:ghpull:`459`).
```
### 4.3
```
* The ``async=`` parameter to integrate with asyncio has become ``async_=``
(:ghpull:`431`), as *async* is becoming a Python keyword from Python 3.6.
Pexpect will still recognise ``async`` as an alternative spelling.
* Similarly, the module ``pexpect.async`` became ``pexpect._async``
(:ghpull:`450`). This module is not part of the public API.
* Fix problems with asyncio objects closing file descriptors during garbage
collection (:ghissue:`347`, :ghpull:`376`).
* Set the ``.pid`` attribute of a :class:`~.PopenSpawn` object (:ghpull:`417`).
* Fix passing Windows paths to :class:`~.PopenSpawn` (:ghpull:`446`).
* :class:`~.PopenSpawn` on Windows can pass string commands through to ``Popen``
without splitting them into a list (:ghpull:`447`).
* Stop ``shlex`` trying to read from stdin when :class:`~.PopenSpawn` is
passed ``cmd=None`` (:ghissue:`433`, :ghpull:`434`).
* Ensure that an error closing a Pexpect spawn object raises a Pexpect error,
rather than a Ptyprocess error (:ghissue:`383`, :ghpull:`386`).
* Cleaned up invalid backslash escape sequences in strings (:ghpull:`430`,
:ghpull:`445`).
* The pattern for a password prompt in :mod:`pexpect.pxssh` changed from
``password`` to ``password:`` (:ghpull:`452`).
* Correct docstring for using unicode with spawn (:ghpull:`395`).
* Various other improvements to documentation.
```
### 4.2.1
```
* Fix to allow running ``env`` in replwrap-ed bash.
* Raise more informative exception from pxssh if it fails to connect.
* Change ``passmass`` example to not log passwords entered.
```
### 4.2
```
* Change: When an ``env`` parameter is specified to the :class:`~.spawn` or
:class:`~.run` family of calls containing a value for ``PATH``, its value is
used to discover the target executable from a relative path, rather than the
current process's environment ``PATH``. This mirrors the behavior of
:func:`subprocess.Popen` in the standard library (:ghissue:`348`).
* Regression: Re-introduce capability for :meth:`read_nonblocking` in class
:class:`fdspawn` as previously supported in version 3.3 (:ghissue:`359`).
```
### 4.0
```
* Integration with :mod:`asyncio`: passing ``async=True`` to :meth:`~.spawn.expect`,
:meth:`~.spawn.expect_exact` or :meth:`~.spawn.expect_list` will make them return a
coroutine. You can get the result using ``yield from``, or wrap it in an
:class:`asyncio.Task`. This allows the event loop to do other things while
waiting for output that matches a pattern.
* Experimental support for Windows (with some caveats)—see :ref:`windows`.
* Enhancement: allow method as callbacks of argument ``events`` for
:func:`pexpect.run` (:ghissue:`176`).
* It is now possible to call :meth:`~.spawn.wait` multiple times, or after a process
is already determined to be terminated without raising an exception
(:ghpull:`211`).
* New :class:`pexpect.spawn` keyword argument, ``dimensions=(rows, columns)``
allows setting terminal screen dimensions before launching a program
(:ghissue:`122`).
* Fix regression that prevented executable, but unreadable files from
being found when not specified by absolute path -- such as
/usr/bin/sudo (:ghissue:`104`).
* Fixed regression when executing pexpect with some prior releases of
the multiprocessing module where stdin has been closed (:ghissue:`86`).
Backwards incompatible changes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Deprecated ``pexpect.screen`` and ``pexpect.ANSI``. Please use other packages
such as `pyte <https://pypi.python.org/pypi/pyte>`__ to emulate a terminal.
* Removed the independent top-level modules (``pxssh fdpexpect FSM screen ANSI``)
which were installed alongside Pexpect. These were moved into the Pexpect
package in 3.0, but the old names were left as aliases.
* Child processes created by Pexpect no longer ignore SIGHUP by default: the
``ignore_sighup`` parameter of :class:`pexpect.spawn` defaults to False. To
get the old behaviour, pass ``ignore_sighup=True``.
```
### 3.3
```
* Added a mechanism to wrap REPLs, or shells, in an object which can conveniently
be used to send commands and wait for the output (:mod:`pexpect.replwrap`).
* Fixed issue where pexpect would attempt to execute a directory because
it has the 'execute' bit set (:ghissue:`37`).
* Removed the ``pexpect.psh`` module. This was never documented, and we found
no evidence that people use it. The new :mod:`pexpect.replwrap` module
provides a more flexible alternative.
* Fixed ``TypeError: got <type 'str'> ('\r\n') as pattern`` in :meth:`spawnu.readline`
method (:ghissue:`67`).
* Fixed issue where EOF was not correctly detected in :meth:`~.interact`, causing
a repeating loop of output on Linux, and blocking before EOF on BSD and
Solaris (:ghissue:`49`).
* Several Solaris (SmartOS) bugfixes, preventing :exc:`IOError` exceptions, especially
when used with cron(1) (:ghissue:`44`).
* Added new keyword argument ``echo=True`` for :class:`spawn`. On SVR4-like
systems, the method :meth:`~.isatty` will always return *False*: the child pty
does not appear as a terminal. Therefore, :meth:`~.setecho`, :meth:`~.getwinsize`,
:meth:`~.setwinsize`, and :meth:`~.waitnoecho` are not supported on those platforms.
After this, we intend to start working on a bigger refactoring of the code, to
be released as Pexpect 4. There may be more bugfix 3.x releases, however.
```
### 3.2
```
* Fix exception handling from :func:`select.select` on Python 2 (:ghpull:`38`).
This was accidentally broken in the previous release when it was fixed for
Python 3.
* Removed a workaround for ``TIOCSWINSZ`` on very old systems, which was causing
issues on some BSD systems (:ghpull:`40`).
* Fixed an issue with exception handling in :mod:`~pexpect.pxssh` (:ghpull:`43`)
The documentation for :mod:`~pexpect.pxssh` was improved.
```
### 3.1
```
* Fix an issue that prevented importing pexpect on Python 3 when ``sys.stdout``
was reassigned (:ghissue:`30`).
* Improve prompt synchronisation in :mod:`~pexpect.pxssh` (:ghpull:`28`).
* Fix pickling exception instances (:ghpull:`34`).
* Fix handling exceptions from :func:`select.select` on Python 3 (:ghpull:`33`).
The examples have also been cleaned up somewhat - this will continue in future
releases.
```
### 3.0
```
The new major version number doesn't indicate any deliberate API incompatibility.
We have endeavoured to avoid breaking existing APIs. However, pexpect is under
new maintenance after a long dormancy, so some caution is warranted.
* A new :ref:`unicode API <unicode>` was introduced.
* Python 3 is now supported, using a single codebase.
* Pexpect now requires at least Python 2.6 or 3.2.
* The modules other than pexpect, such as :mod:`pexpect.fdpexpect` and
:mod:`pexpect.pxssh`, were moved into the pexpect package. For now, wrapper
modules are installed to the old locations for backwards compatibility (e.g.
``import pxssh`` will still work), but these will be removed at some point in
the future.
* Ignoring ``SIGHUP`` is now optional - thanks to Kimmo Parviainen-Jalanko for
the patch.
We also now have `docs on ReadTheDocs <https://pexpect.readthedocs.io/>`_,
and `continuous integration on Travis CI <https://travis-ci.org/pexpect/pexpect>`_.
```
Links
- PyPI: https://pypi.org/project/pexpect
- Changelog: https://pyup.io/changelogs/pexpect/
- Docs: https://pexpect.readthedocs.io/
This PR updates pexpect from 2.4 to 4.7.0.
Changelog
### 4.7 ``` * The :meth:`.pxssh.login` method now no longer requires a username if an ssh config is provided and will raise an error if neither are provided. (:ghpull:`562`). * The :meth:`.pxssh.login` method now supports providing your own ``ssh`` command via the ``cmd`` parameter. (:ghpull:`528`) (:ghpull:`563`). * :class:`.pxssh` now supports the ``use_poll`` parameter which is passed into :meth:`.pexpect.spawn` (:ghpull:`542`). * Minor bug fix with ``ssh_config``. (:ghpull:`498`). * :meth:`.replwrap.run_command` now has async support via an ``async_`` parameter. (:ghpull:`501`). * :meth:`.pexpect.spawn` will now read additional bytes if able up to a buffer limit. (:ghpull:`304`). ``` ### 4.6 ``` * The :meth:`.pxssh.login` method now supports an ``ssh_config`` parameter, which can be used to specify a file path to an SSH config file (:ghpull:`490`). * Improved compatability for the ``crlf`` parameter of :class:`~.PopenSpawn` (:ghpull:`493`) * Fixed an issue in read timeout handling when using :class:`~.spawn` and :class:`~.fdspawn` with the ``use_poll`` parameter (:ghpull:`492`). ``` ### 4.5 ``` * :class:`~.spawn` and :class:`~.fdspawn` now have a ``use_poll`` parameter. If this is True, they will use :func:`select.poll` instead of :func:`select.select`. ``poll()`` allows file descriptors above 1024, but it must be explicitly enabled due to compatibility concerns (:ghpull:`474`). * The :meth:`.pxssh.login` method has several new and changed options: * The option ``password_regex`` allows changing the password prompt regex, for servers that include ``password:`` in a banner before reaching a prompt (:ghpull:`468`). * :meth:`~.pxssh.login` now allows for setting up SSH tunnels to be requested once logged in to the remote server. This option is ``ssh_tunnels`` (:ghpull:`473`). The structure should be like this:: { 'local': ['2424:localhost:22'], Local SSH tunnels 'remote': ['2525:localhost:22'], Remote SSH tunnels 'dynamic': [8888], Dynamic/SOCKS tunnels } * The option ``spawn_local_ssh=False`` allows subsequent logins from the remote session and treats the session as if it was local (:ghpull:`472`). * Setting ``sync_original_prompt=False`` will prevent changing the prompt to something unique, in case the remote server is sensitive to new lines at login (:ghpull:`468`). * If ``ssh_key=True`` is passed, the SSH client forces forwarding the authentication agent to the remote server instead of providing a key (:ghpull:`473`). ``` ### 4.4 ``` * :class:`~.PopenSpawn` now has a ``preexec_fn`` parameter, like :class:`~.spawn` and :class:`subprocess.Popen`, for a function to be called in the child process before executing the new command. Like in ``Popen``, this works only in POSIX, and can cause issues if your application also uses threads (:ghpull:`460`). * Significant performance improvements when processing large amounts of data (:ghpull:`464`). * Ensure that ``spawn.closed`` gets set by :meth:`~.spawn.close`, and improve an example for passing ``SIGWINCH`` through to a child process (:ghpull:`466`). ``` ### 4.3.1 ``` * When launching bash for :mod:`pexpect.replwrap`, load the system ``bashrc`` from a couple of different common locations (:ghpull:`457`), and then unset the ``PROMPT_COMMAND`` environment variable, which can interfere with the prompt we're expecting (:ghpull:`459`). ``` ### 4.3 ``` * The ``async=`` parameter to integrate with asyncio has become ``async_=`` (:ghpull:`431`), as *async* is becoming a Python keyword from Python 3.6. Pexpect will still recognise ``async`` as an alternative spelling. * Similarly, the module ``pexpect.async`` became ``pexpect._async`` (:ghpull:`450`). This module is not part of the public API. * Fix problems with asyncio objects closing file descriptors during garbage collection (:ghissue:`347`, :ghpull:`376`). * Set the ``.pid`` attribute of a :class:`~.PopenSpawn` object (:ghpull:`417`). * Fix passing Windows paths to :class:`~.PopenSpawn` (:ghpull:`446`). * :class:`~.PopenSpawn` on Windows can pass string commands through to ``Popen`` without splitting them into a list (:ghpull:`447`). * Stop ``shlex`` trying to read from stdin when :class:`~.PopenSpawn` is passed ``cmd=None`` (:ghissue:`433`, :ghpull:`434`). * Ensure that an error closing a Pexpect spawn object raises a Pexpect error, rather than a Ptyprocess error (:ghissue:`383`, :ghpull:`386`). * Cleaned up invalid backslash escape sequences in strings (:ghpull:`430`, :ghpull:`445`). * The pattern for a password prompt in :mod:`pexpect.pxssh` changed from ``password`` to ``password:`` (:ghpull:`452`). * Correct docstring for using unicode with spawn (:ghpull:`395`). * Various other improvements to documentation. ``` ### 4.2.1 ``` * Fix to allow running ``env`` in replwrap-ed bash. * Raise more informative exception from pxssh if it fails to connect. * Change ``passmass`` example to not log passwords entered. ``` ### 4.2 ``` * Change: When an ``env`` parameter is specified to the :class:`~.spawn` or :class:`~.run` family of calls containing a value for ``PATH``, its value is used to discover the target executable from a relative path, rather than the current process's environment ``PATH``. This mirrors the behavior of :func:`subprocess.Popen` in the standard library (:ghissue:`348`). * Regression: Re-introduce capability for :meth:`read_nonblocking` in class :class:`fdspawn` as previously supported in version 3.3 (:ghissue:`359`). ``` ### 4.0 ``` * Integration with :mod:`asyncio`: passing ``async=True`` to :meth:`~.spawn.expect`, :meth:`~.spawn.expect_exact` or :meth:`~.spawn.expect_list` will make them return a coroutine. You can get the result using ``yield from``, or wrap it in an :class:`asyncio.Task`. This allows the event loop to do other things while waiting for output that matches a pattern. * Experimental support for Windows (with some caveats)—see :ref:`windows`. * Enhancement: allow method as callbacks of argument ``events`` for :func:`pexpect.run` (:ghissue:`176`). * It is now possible to call :meth:`~.spawn.wait` multiple times, or after a process is already determined to be terminated without raising an exception (:ghpull:`211`). * New :class:`pexpect.spawn` keyword argument, ``dimensions=(rows, columns)`` allows setting terminal screen dimensions before launching a program (:ghissue:`122`). * Fix regression that prevented executable, but unreadable files from being found when not specified by absolute path -- such as /usr/bin/sudo (:ghissue:`104`). * Fixed regression when executing pexpect with some prior releases of the multiprocessing module where stdin has been closed (:ghissue:`86`). Backwards incompatible changes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Deprecated ``pexpect.screen`` and ``pexpect.ANSI``. Please use other packages such as `pyte <https://pypi.python.org/pypi/pyte>`__ to emulate a terminal. * Removed the independent top-level modules (``pxssh fdpexpect FSM screen ANSI``) which were installed alongside Pexpect. These were moved into the Pexpect package in 3.0, but the old names were left as aliases. * Child processes created by Pexpect no longer ignore SIGHUP by default: the ``ignore_sighup`` parameter of :class:`pexpect.spawn` defaults to False. To get the old behaviour, pass ``ignore_sighup=True``. ``` ### 3.3 ``` * Added a mechanism to wrap REPLs, or shells, in an object which can conveniently be used to send commands and wait for the output (:mod:`pexpect.replwrap`). * Fixed issue where pexpect would attempt to execute a directory because it has the 'execute' bit set (:ghissue:`37`). * Removed the ``pexpect.psh`` module. This was never documented, and we found no evidence that people use it. The new :mod:`pexpect.replwrap` module provides a more flexible alternative. * Fixed ``TypeError: got <type 'str'> ('\r\n') as pattern`` in :meth:`spawnu.readline` method (:ghissue:`67`). * Fixed issue where EOF was not correctly detected in :meth:`~.interact`, causing a repeating loop of output on Linux, and blocking before EOF on BSD and Solaris (:ghissue:`49`). * Several Solaris (SmartOS) bugfixes, preventing :exc:`IOError` exceptions, especially when used with cron(1) (:ghissue:`44`). * Added new keyword argument ``echo=True`` for :class:`spawn`. On SVR4-like systems, the method :meth:`~.isatty` will always return *False*: the child pty does not appear as a terminal. Therefore, :meth:`~.setecho`, :meth:`~.getwinsize`, :meth:`~.setwinsize`, and :meth:`~.waitnoecho` are not supported on those platforms. After this, we intend to start working on a bigger refactoring of the code, to be released as Pexpect 4. There may be more bugfix 3.x releases, however. ``` ### 3.2 ``` * Fix exception handling from :func:`select.select` on Python 2 (:ghpull:`38`). This was accidentally broken in the previous release when it was fixed for Python 3. * Removed a workaround for ``TIOCSWINSZ`` on very old systems, which was causing issues on some BSD systems (:ghpull:`40`). * Fixed an issue with exception handling in :mod:`~pexpect.pxssh` (:ghpull:`43`) The documentation for :mod:`~pexpect.pxssh` was improved. ``` ### 3.1 ``` * Fix an issue that prevented importing pexpect on Python 3 when ``sys.stdout`` was reassigned (:ghissue:`30`). * Improve prompt synchronisation in :mod:`~pexpect.pxssh` (:ghpull:`28`). * Fix pickling exception instances (:ghpull:`34`). * Fix handling exceptions from :func:`select.select` on Python 3 (:ghpull:`33`). The examples have also been cleaned up somewhat - this will continue in future releases. ``` ### 3.0 ``` The new major version number doesn't indicate any deliberate API incompatibility. We have endeavoured to avoid breaking existing APIs. However, pexpect is under new maintenance after a long dormancy, so some caution is warranted. * A new :ref:`unicode API <unicode>` was introduced. * Python 3 is now supported, using a single codebase. * Pexpect now requires at least Python 2.6 or 3.2. * The modules other than pexpect, such as :mod:`pexpect.fdpexpect` and :mod:`pexpect.pxssh`, were moved into the pexpect package. For now, wrapper modules are installed to the old locations for backwards compatibility (e.g. ``import pxssh`` will still work), but these will be removed at some point in the future. * Ignoring ``SIGHUP`` is now optional - thanks to Kimmo Parviainen-Jalanko for the patch. We also now have `docs on ReadTheDocs <https://pexpect.readthedocs.io/>`_, and `continuous integration on Travis CI <https://travis-ci.org/pexpect/pexpect>`_. ```Links
- PyPI: https://pypi.org/project/pexpect - Changelog: https://pyup.io/changelogs/pexpect/ - Docs: https://pexpect.readthedocs.io/