pipes.md
1> **Источник:** https://python-all.ru/2.7/library/pipes.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 36.11. [`pipes`](https://python-all.ru/2.7/library/pipes.html#module-pipes) – Интерфейс к конвейерам оболочки89**Исходный код:** [Lib/pipes.py](https://python-all.ru/src/2.7/Lib/pipes.py)1011---1213Модуль [`pipes`](https://python-all.ru/2.7/library/pipes.html#module-pipes) определяет класс, который абстрагирует понятие *конвейера* – последовательности преобразователей из одного файла в другой.1415Поскольку модуль использует командные строки **/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).1617#### `class pipes.Template`1819Абстракция конвейера.2021Пример:2223```python24>>> import pipes25>>> t = pipes.Template()26>>> t.append('tr a-z A-Z', '--')27>>> f = t.open('pipefile', 'w')28>>> f.write('hello world')29>>> f.close()30>>> open('pipefile').read()31'HELLO WORLD'32```3334#### `pipes.quote(s)`3536Устарело с версии 2.7: До Python 2.7 эта функция не была публично документирована. В Python 3.3 она наконец стала общедоступной как функция `quote` в модуле [`shlex`](https://python-all.ru/2.7/library/shlex.html#module-shlex).3738Возвращает экранированную для оболочки версию строки *s*. Возвращаемое значение – это строка, которую можно безопасно использовать как один токен в командной строке оболочки в тех случаях, когда нельзя использовать список.3940Этот подход был бы небезопасен:4142```python43>>> filename = 'somefile; rm -rf ~'44>>> command = 'ls -l {}'.format(filename)45>>> print command # выполнено оболочкой: бабах!46ls -l somefile; rm -rf ~47```4849[`quote()`](https://python-all.ru/2.7/library/pipes.html#pipes.quote) позволяет закрыть брешь в безопасности:5051```python52>>> command = 'ls -l {}'.format(quote(filename))53>>> print command54ls -l 'somefile; rm -rf ~'55>>> remote_command = 'ssh home {}'.format(quote(command))56>>> print remote_command57ssh home 'ls -l '"'"'somefile; rm -rf ~'"'"''58```5960Экранирование совместимо с оболочками UNIX и с [`shlex.split()`](https://python-all.ru/2.7/library/shlex.html#shlex.split):6162```python63>>> remote_command = shlex.split(remote_command)64>>> remote_command65['ssh', 'home', "ls -l 'somefile; rm -rf ~'"]66>>> command = shlex.split(remote_command[-1])67>>> command68['ls', '-l', 'somefile; rm -rf ~']69```7071## 36.11.1. Объекты Template7273У объектов Template есть следующие методы:7475#### `Template.reset()`7677Восстанавливает шаблон конвейера в исходное состояние.7879#### `Template.clone()`8081Возвращает новый эквивалентный шаблон конвейера.8283#### `Template.debug(flag)`8485Если *flag* равен true, включить отладку. В противном случае выключить. Когда отладка включена, выводится список команд, которые будут выполнены, а оболочке передаётся команда `set -x` для более подробного вывода.8687#### `Template.append(cmd, kind)`8889Добавляет новое действие в конец. Переменная *cmd* должна быть корректной командой Bourne shell. Переменная *kind* состоит из двух букв.9091Первая буква может быть либо `'-'` (команда читает свой стандартный ввод), `'f'` (команда читает указанный файл из командной строки) или `'.'` (команда не читает никаких данных, поэтому должна быть первой).9293Аналогично, вторая буква может быть либо `'-'` (команда пишет в стандартный вывод), `'f'` (команда пишет в файл, указанный в командной строке) или `'.'` (команда ничего не пишет, поэтому должна быть последней).9495#### `Template.prepend(cmd, kind)`9697Добавляет новое действие в начало. См. [`append()`](https://python-all.ru/2.7/library/pipes.html#pipes.Template.append) для объяснения аргументов.9899#### `Template.open(file, mode)`100101Возвращает файлоподобный объект, открытый для *file*, но данные читаются из конвейера или записываются в конвейер. Обратите внимание, что можно указать только одно из значений `'r'`, `'w'`.102103#### `Template.copy(infile, outfile)`104105Копирует *infile* в *outfile* через конвейер.106