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.