Документация Python неофициальный перевод
Содержание страницы

36.11. pipes – Интерфейс к конвейерам оболочкиpipes – Interface to shell pipelines

Исходный код: Lib/pipes.py


Модуль pipes определяет класс, который абстрагирует понятие конвейера – последовательности преобразователей из одного файла в другой.

Поскольку модуль использует командные строки /bin/sh, требуется POSIX-совместимая оболочка для os.system() и os.popen().

class pipes.Template

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

Пример:

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

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

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

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

quote() позволяет закрыть брешь в безопасности:

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

>>> 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. Объекты TemplateTemplate Objects

У объектов 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() для объяснения аргументов.

Template.open(file, mode)

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

Template.copy(infile, outfile)

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