36.11. "pipes" — Interface au *pipelines* shell
***********************************************

**Code source :** Lib/pipes.py

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

Le module "pipes" définit une classe permettant d’abstraire le concept
de *pipeline* — une séquence de convertisseurs d’un fichier vers un
autre.

Du fait que le module utilise les lignes de commandes **/bin/sh**, un
shell POSIX ou compatible est requis pour "os.system()" et
"os.popen()".

class pipes.Template

   Une abstraction d’un *pipeline*.

Exemple :

   >>> import pipes
   >>> t = pipes.Template()
   >>> t.append('tr a-z A-Z', '--')
   >>> f = t.open('pipefile', 'w')
   >>> f.write('hello world')
   >>> f.close()
   >>> open('pipefile').read()
   'HELLO WORLD'

pipes.quote(s)

   Obsolète depuis la version 2.7: Prior to Python 2.7, this function
   was not publicly documented.  It is finally exposed publicly in
   Python 3.3 as the "quote" function in the "shlex" module.

   Return a shell-escaped version of the string *s*.  The returned
   value is a string that can safely be used as one token in a shell
   command line, for cases where you cannot use a list.

   This idiom would be unsafe:

      >>> filename = 'somefile; rm -rf ~'
      >>> command = 'ls -l {}'.format(filename)
      >>> print command  # executed by a shell: boom!
      ls -l somefile; rm -rf ~

   "quote()" lets you plug the security hole:

      >>> command = 'ls -l {}'.format(quote(filename))
      >>> print command
      ls -l 'somefile; rm -rf ~'
      >>> remote_command = 'ssh home {}'.format(quote(command))
      >>> print remote_command
      ssh home 'ls -l '"'"'somefile; rm -rf ~'"'"''

   The quoting is compatible with UNIX shells and with
   "shlex.split()":

   >>> remote_command = shlex.split(remote_command)
   >>> remote_command
   ['ssh', 'home', "ls -l 'somefile; rm -rf ~'"]
   >>> command = shlex.split(remote_command[-1])
   >>> command
   ['ls', '-l', 'somefile; rm -rf ~']


36.11.1. L’Objet *Template*
===========================

Les méthodes de l’objet *Template* :

Template.reset()

   Réinitialise un modèle de *pipeline* à son état initial.

Template.clone()

   Renvoie un nouveau modèle de *pipeline*, équivalent.

Template.debug(flag)

   Si *flag* est vrai, active le débogage. Sinon, le désactive. Quand
   le débogage est actif, les commandes à exécuter seront affichée et
   le shell est pourvu de la commande "set -x" afin d’être plus
   verbeux.

Template.append(cmd, kind)

   Ajoute une nouvelle action à la fin. La variable *cmd* doit être
   une commande *bourne shell* valide. La variable *kind* est composée
   de deux lettres.

   La première lettre peut soit être "'-'" (qui signifie que la
   commande lit sa sortie standard), soit "'f'" (qui signifie que la
   commande lit un fichier donné par la ligne de commande), soit "'.'"
   (qui signifie que la commande ne lit pas d’entrée, et donc doit
   être la première.)

   De même, la seconde lettre peut soit être "'-'" (qui signifie que
   la commande écrit sur la sortie standard), soit "'f'" (qui signifie
   que la commande écrit sur un fichier donné par la ligne de
   commande), soit "'.'" (qui signifie que la commande n’écrit rien,
   et donc doit être la dernière.)

Template.prepend(cmd, kind)

   Ajoute une nouvelle action au début. Voir "append()" pour plus
   d’explications sur les arguments.

Template.open(file, mode)

   Renvoie un objet *file-like*, ouvert à *file*, mais permettant
   d’écrire vers le *pipeline* ou de lire depuis celui-ci. À noter que
   seulement un des deux (“r” ou “w”) peut être donné.

Template.copy(infile, outfile)

   Copie *infile* vers *outfile* au travers du *pipe*.
