Выбрать главу

C:\...\PP4E\System\Streams> python teststreams.py < input.txt > output.txt

C:\...\PP4E\System\Streams> type output.txt

Hello stream world

Enter a number>8 squared is 64

Enter a number>6 squared is 36

Enter a number>Bye

На этот раз стандартные потоки ввода и вывода сценария отображаются в текстовые файлы, а не в сеанс интерактивной консоли.

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

В 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