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