35.6. "termios" — Le style POSIX le contrôle TTY
************************************************

======================================================================

Ce module fournit une interface aux appels POSIX pour le contrôle des
E/S TTY. Pour une description complète de ces appels, voir la page du
manuel UNIX *termios(3)*. C’est disponible uniquement pour les
versions Unix qui supportent le style POSIX *termios* et les contrôles
d’entrées/sorties TTY configurés à l’installation.

Toutes les fonctions de ce module prennent un descripteur de fichier
*fd* comme premier argument. Ça peut être un descripteur de fichiers
entier, tel que le retourne "sys.stdin.fileno()", ou un *file object*,
tel que "sys.stdin".

Ce module définit aussi toutes les constantes nécessaires pour
travailler avec les fonctions fournies ici; elles ont les mêmes noms
que leurs équivalents en C. Pour plus d’informations sur l’utilisation
de ces terminaux, veuillez vous référer à votre documentation système.

Le module définit les fonctions suivantes :

termios.tcgetattr(fd)

   Retourne une liste contenant les attributs TTY pour le descripteur
   de fichier *fd*, tel que: "[iflag, oflag, cflag, lflag, ispeed,
   ospeed, cc]" où *cc* est une liste de caractères spéciaux TTY
   (chacun est une chaine de caractère de longueur 1, à l’exception
   des éléments ayant les indices "VMIN" et "VTIME", ceux-ci sont
   alors des entiers quand ces champs sont définis). L’interprétation
   des options (*flags* en anglais) et des vitesses ainsi que
   l’indexation dans le tableau *cc* doit être fait en utilisant les
   constantes symboliques définies dans le module "termios".

termios.tcsetattr(fd, when, attributes)

   Définit les attributs TTY pour le descripteur de fichiers *fd* à
   partir des *attributs*, qui est une liste comme celle retournée par
   "tcgetattr()". L’argument *when* détermine quand les attributs sont
   changés: "TCSANOW" pour un changement immédiat, "TCSADRAIN" pour un
   changement après la transmission de toute sortie en file d’attente,
   ou "TCSAFLUSH" pour un changement après avoir transmis toute sortie
   en file d’attente et rejeté toutes entrée en file d’attente.

termios.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.

termios.tcdrain(fd)

   Attends que toutes les sorties écrites dans le descripteur de
   fichier *fd* soient transmises.

termios.tcflush(fd, queue)

   Vide la queue de données du descripteur de fichier *fd*. Le
   sélecteur *queue* précise la queue: "TCIFLUSH" pour la queue des
   entrées, "TCOFLUSH" pour la queue des sorties, ou "TCIOFLUSH" pour
   les deux queues.

termios.tcflow(fd, action)

   Suspends ou reprends l’entrée ou la sortie du descripteur de
   fichier *fd*. L’argument *action* peut être "TCOOFF" pour suspendre
   la sortie, "TCOON" pour relancer la sortie, "TCIOFF" pour suspendre
   l’entrée, ou "TCION" pour relancer l’entrée.

Voir aussi:

  Le module "tty"
     Fonctions utiles pour les opérations de contrôle communes dans le
     terminal.


35.6.1. Exemple
===============

Voici une fonction qui demande à l’utilisateur d’entrer un mot de
passe sans l’afficher. Remarquez la technique qui consiste à séparer
un appel à "tcgetattr()" et une instruction "try"… "finally" pour
s’assurer que les anciens attributs tty soient restaurés tels quels
quoi qu’il arrive :

   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
