> **Источник:** https://python-all.ru/2.7/library/pipes.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# 36.11. [`pipes`](https://python-all.ru/2.7/library/pipes.html#module-pipes) – Интерфейс к конвейерам оболочки

**Исходный код:** [Lib/pipes.py](https://python-all.ru/src/2.7/Lib/pipes.py)

---

Модуль [`pipes`](https://python-all.ru/2.7/library/pipes.html#module-pipes) определяет класс, который абстрагирует понятие *конвейера* – последовательности преобразователей из одного файла в другой.

Поскольку модуль использует командные строки **/bin/sh**, требуется POSIX-совместимая оболочка для [`os.system()`](https://python-all.ru/2.7/library/os.html#os.system) и [`os.popen()`](https://python-all.ru/2.7/library/os.html#os.popen).

#### `class pipes.Template`

Абстракция конвейера.

Пример:

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

Устарело с версии 2.7: До Python 2.7 эта функция не была публично документирована. В Python 3.3 она наконец стала общедоступной как функция `quote` в модуле [`shlex`](https://python-all.ru/2.7/library/shlex.html#module-shlex).

Возвращает экранированную для оболочки версию строки *s*. Возвращаемое значение – это строка, которую можно безопасно использовать как один токен в командной строке оболочки в тех случаях, когда нельзя использовать список.

Этот подход был бы небезопасен:

```python
>>> filename = 'somefile; rm -rf ~'
>>> command = 'ls -l {}'.format(filename)
>>> print command  # выполнено оболочкой: бабах!
ls -l somefile; rm -rf ~
```

[`quote()`](https://python-all.ru/2.7/library/pipes.html#pipes.quote) позволяет закрыть брешь в безопасности:

```python
>>> 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 ~'"'"''
```

Экранирование совместимо с оболочками UNIX и с [`shlex.split()`](https://python-all.ru/2.7/library/shlex.html#shlex.split):

```python
>>> 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

У объектов Template есть следующие методы:

#### `Template.reset()`

Восстанавливает шаблон конвейера в исходное состояние.

#### `Template.clone()`

Возвращает новый эквивалентный шаблон конвейера.

#### `Template.debug(flag)`

Если *flag* равен true, включить отладку. В противном случае выключить. Когда отладка включена, выводится список команд, которые будут выполнены, а оболочке передаётся команда `set -x` для более подробного вывода.

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

Добавляет новое действие в конец. Переменная *cmd* должна быть корректной командой Bourne shell. Переменная *kind* состоит из двух букв.

Первая буква может быть либо `'-'` (команда читает свой стандартный ввод), `'f'` (команда читает указанный файл из командной строки) или `'.'` (команда не читает никаких данных, поэтому должна быть первой).

Аналогично, вторая буква может быть либо `'-'` (команда пишет в стандартный вывод), `'f'` (команда пишет в файл, указанный в командной строке) или `'.'` (команда ничего не пишет, поэтому должна быть последней).

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

Добавляет новое действие в начало. См. [`append()`](https://python-all.ru/2.7/library/pipes.html#pipes.Template.append) для объяснения аргументов.

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

Возвращает файлоподобный объект, открытый для *file*, но данные читаются из конвейера или записываются в конвейер. Обратите внимание, что можно указать только одно из значений `'r'`, `'w'`.

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

Копирует *infile* в *outfile* через конвейер.
