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

.. module:: termios
   :platform: Unix
   :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

