# 36.11. `pipes` — Interface to shell pipelines

Source code: Lib/pipes.py

The `pipes` module defines a class to abstract the concept of a pipeline — a sequence of converters from one file to another.

Because the module uses /bin/sh command lines, a POSIX or compatible shell for `os.system()` and `os.popen()` is required.

class `pipes.``Template`

  An abstraction of a pipeline.

Example:

    >>> 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)

  Deprecated since 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. Template Objects

Template objects following methods:

`Template.``reset`()

  Restore a pipeline template to its initial state.

`Template.``clone`()

  Return a new, equivalent, pipeline template.

`Template.``debug`(flag)

  If flag is true, turn debugging on. Otherwise, turn debugging off. When debugging is on, commands to be executed are printed, and the shell is given `set -x` command to be more verbose.

`Template.``append`(cmd, kind)

  Append a new action at the end. The cmd variable must be a valid bourne shell command. The kind variable consists of two letters.

  The first letter can be either of `'-'` (which means the command reads its standard input), `'f'` (which means the commands reads a given file on the command line) or `'.'` (which means the commands reads no input, and hence must be first.)

  Similarly, the second letter can be either of `'-'` (which means the command writes to standard output), `'f'` (which means the command writes a file on the command line) or `'.'` (which means the command does not write anything, and hence must be last.)

`Template.``prepend`(cmd, kind)

  Add a new action at the beginning. See `append()` for explanations of the arguments.

`Template.``open`(file, mode)

  Return a file-like object, open to file, but read from or written to by the pipeline. Note that only one of `'r'`, `'w'` may be given.

`Template.``copy`(infile, outfile)

  Copy infile to outfile through the pipe.