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