Соединение программ с помощью каналов

soedinenie programm s pomoshhju kanalov Контекст выполнения сценариев

В Windows и в Unix-подобных системах имеется возможность направлять стандартный вывод одной программы в стандартный ввод другой, помещая между командами символ |. Обычно это называется операцией создания «канала» или «конвейера»: оболочка создает канал, соединяющий вывод и ввод двух команд. Попробуем отправить вывод сценария на вход программы more, чтобы увидеть, как действует этот прием:

подпись: c:\...\pp4e\system\streams>python teststreams.py < input.txt | more

Hello stream world

Enter a number>8 squared is 64

Enter a number>6 squared is 36

Enter a number>Bye

В этом примере данные также поступают в поток стандартного ввода сценария teststreams из файла, но выходные данные (которые выводятся вызовами функции print) посылаются другой программе, а не в файл или окно. Принимающей программой является more — стандартная программа командной строки для постраничного просмотра, имеющаяся в Windows и в Unix-подобных системах. Поскольку Python привязывает сценарии к стандартной модели потоков ввода-вывода, сценарии на языке Python можно использовать с обоих концов канала: вывод одного сценария Python всегда можно отправить на ввод другого:

C:\\PP4E\System\Streams> type writer.py print(“Help! Help! I’m being repressed!”) print(42)

C:\\PP4E\System\Streams> type reader.py print(‘Got this: “%s”’ % input()) import sys data = sys.stdin.readline()[:-1] print(‘The meaning of life is’, data, int(data) * 2)

C:\\PP4E\System\Streams> python writer.py

Help! Help! I’m being repressed!

42

C:\\PP4E\System\Streams> python writer.py | python reader.py

Got this: “Help! Help! I’m being repressed!”

The meaning of life is 42 84

На этот раз связь устанавливается между двумя программами на языке Python. Сценарий reader получает входные данные от сценария writer — оба сценария просто используют стандартные функции чтения и записи, не задумываясь о работе механизма потоков. На практике такое соединение программ в цепочку является простой формой организации взаимодействий между программами. Оно облегчает повторное использование утилит, предусматривающих возможность взаимодействий через stdin и stdout, самыми неожиданными способами. Например, программу на языке Python, которая сортирует текст, поступающий из stdin, можно использовать для работы с любым источником данных, в том числе с выводом других сценариев. Рассмотрим сценарии командной строки из примеров 3.6 и 3.7, которые сортируют строки с числами, поступающие в стандартный поток ввода, и складывают их.

Пример 3.6. PP4E\System\Streams\sorter.py

import sys # или sorted(sys.stdin)

lines = sys.stdin.readlines() # читает входные строки из stdin,

lines.sort() # сортирует их

for line in lines: print(line, end=’’) # отправляет результаты в stdout # для дальнейшей обработки

Пример 3.7. PP4E\System\Streams\adder.py

import sys sum = 0 while True: try: line = input() # или sys.stdin.readlines() except EOFError: # или for line in sys.stdin:

break # input отсекает символы \n в конце строк

else:

sum += int(line) # во 2-м издании использовалась функция sting.atoi() print(sum)

Мы можем использовать эти универсальные инструменты командной строки, чтобы с их помощью сортировать и складывать содержимое произвольных файлов и вывода других программ (примечание для пользователей Windows: на моей предыдущей машине с Windows XP и Python 2.X я должен был вводить команду «python file.py», а не просто «file.py», в противном случае перенаправление не давало ожидаемых результатов; ныне, в Windows 7 и Python 3.X, обе формы команд действуют корректно):

C:\\PP4E\System\Streams> type data.txt 123 000 999 042

C:\\PP4E\System\Streams> python sorter.py < data.txt сортировка файла 000 042 123 999

C:\\PP4E\System\Streams> python adder.py < data.txt вычисление суммы 1164

C:\\PP4E\System\Streams> type data.txt | python adder.py вычисление суммы 1164 для вывода

команды type

C:\\PP4E\System\Streams> type writer2.py for data in (123, 0, 999, 42): print(‘%03d’ % data)

C:\\PP4E\System\Streams> python writer2.py | python sorter.py сортировка 000 вывода сценария

042

123

999

C:\\PP4E\System\Streams> writer2.py | sorter.py краткая форма записи выводит те же результаты, что и предыдущая команда Windows

C:\\PP4E\System\Streams> python writer2.py | python sorter.py | python adder. py 1164

В последней команде составлена цепочка из трех сценариев на языке Python: вывод каждого предыдущего сценария соединяется с вводом последующего с помощью синтаксиса конвейера.

Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011

Оцените статью
Секреты программирования
Добавить комментарий