:mod:`!termios` --- POSIX style tty control
===========================================

.. module:: termios
   :synopsis: POSIX style tty control.

.. index::
   pair: POSIX; I/O control
   pair: tty; I/O control

--------------

This module provides an interface to the POSIX calls for tty I/O control. For a
complete description of these calls, see :manpage:`termios(3)` Unix manual
page.  It is only available for those Unix versions that support POSIX
*termios* style tty I/O control configured during installation.

.. availability:: Unix.

All functions in this module take a file descriptor *fd* as their first
argument.  This can be an integer file descriptor, such as returned by
``sys.stdin.fileno()``, or a :term:`file object`, such as ``sys.stdin`` itself.

This module also defines all the constants needed to work with the functions
provided here; these have the same name as their counterparts in C.  Please
refer to your system documentation for more information on using these terminal
control interfaces.

The module defines the following functions:


.. function:: tcgetattr(fd)

   Return a list containing the tty attributes for file descriptor *fd*, as
   follows: ``[iflag, oflag, cflag, lflag, ispeed, ospeed, cc]`` where *cc* is a
   list of the tty special characters (each a string of length 1, except the
   items with indices :const:`VMIN` and :const:`VTIME`, which are integers when
   these fields are defined).  The interpretation of the flags and the speeds as
   well as the indexing in the *cc* array must be done using the symbolic
   constants defined in the :mod:`!termios` module.


.. function:: tcsetattr(fd, when, attributes)

   Set the tty attributes for file descriptor *fd* from the *attributes*, which is
   a list like the one returned by :func:`tcgetattr`.  The *when* argument
   determines when the attributes are changed:

   .. data:: TCSANOW

      Change attributes immediately.

   .. data:: TCSADRAIN

      Change attributes after transmitting all queued output.

   .. data:: TCSAFLUSH

      Change attributes after transmitting all queued output and
      discarding all queued input.


.. function:: tcsendbreak(fd, duration)

   Send a break on file descriptor *fd*.  A zero *duration* sends a break for
   0.25--0.5 seconds; a nonzero *duration* has a system dependent meaning.


.. function:: tcdrain(fd)

   Wait until all output written to file descriptor *fd* has been transmitted.


.. function:: tcflush(fd, queue)

   Discard queued data on file descriptor *fd*.  The *queue* selector specifies
   which queue: :const:`TCIFLUSH` for the input queue, :const:`TCOFLUSH` for the
   output queue, or :const:`TCIOFLUSH` for both queues.


.. function:: tcflow(fd, action)

   Suspend or resume input or output on file descriptor *fd*.  The *action*
   argument can be :const:`TCOOFF` to suspend output, :const:`TCOON` to restart
   output, :const:`TCIOFF` to suspend input, or :const:`TCION` to restart input.


.. function:: tcgetwinsize(fd)

   Return a tuple ``(ws_row, ws_col)`` containing the tty window size for file
   descriptor *fd*. Requires :const:`termios.TIOCGWINSZ` or
   :const:`termios.TIOCGSIZE`.

   .. versionadded:: 3.11


.. function:: tcsetwinsize(fd, winsize)

   Set the tty window size for file descriptor *fd* from *winsize*, which is
   a two-item tuple ``(ws_row, ws_col)`` like the one returned by
   :func:`tcgetwinsize`. Requires at least one of the pairs
   (:const:`termios.TIOCGWINSZ`, :const:`termios.TIOCSWINSZ`);
   (:const:`termios.TIOCGSIZE`, :const:`termios.TIOCSSIZE`) to be defined.

   .. versionadded:: 3.11


.. seealso::

   Module :mod:`tty`
      Convenience functions for common terminal control operations.


.. _termios-example:

Example
-------

Here's a function that prompts for a password with echoing turned off.  Note the
technique using a separate :func:`tcgetattr` call and a :keyword:`try` ...
:keyword:`finally` statement to ensure that the old tty attributes are restored
exactly no matter what happens::

   def getpass(prompt="Password: "):
       import termios, sys
       fd = sys.stdin.fileno()
       old = termios.tcgetattr(fd)
       new = termios.tcgetattr(fd)
       new[3] = new[3] & ~termios.ECHO          # lflags
       try:
           termios.tcsetattr(fd, termios.TCSADRAIN, new)
           passwd = input(prompt)
       finally:
           termios.tcsetattr(fd, termios.TCSADRAIN, old)
       return passwd

