Передавая в функцию флаг нужного режима, мы фактически выполняем перенаправление в файл потока ввода или вывода программы, порожденной сценарием, и можем получить код завершения этой программы вызовом метода close (значение None говорит об успешном завершении). Чтобы проиллюстрировать это, рассмотрим следующие два сценария:
C:\…\PP4E\System\Streams> type hello—out.py print(‘Hello shell world’)
C:\…\PP4E\System\Streams> type hello-in.py inp = input()
open(‘hello-in.txt’, ‘w’).write(‘Hello ‘ + inp + ‘\n’)
Эти сценарии могут запускаться из командной строки, как обычно:
C:\…\PP4E\System\Streams> python hello-out.py Hello shell world
C:\…\PP4E\System\Streams> python hello-in.py Brian
C:\…\PP4E\System\Streams> type hello-in.txt Hello Brian
В предыдущей главе мы видели, что сценарии на языке Python могут также читать вывод других программ и подобных им сценариев, как показано ниже:
C:\…\PP4E\System\Streams> python
> >> import os
> >> pipe = os.popen(‘python hello-out.py’) # ‘r’ — по умолчанию, чтение stdout
> >> pipe.read()
‘Hello shell world\n’
> >> print(pipe.close()) # код завершения: None — успех
None
Но сценарии на языке Python могут играть роль источников данных, подаваемых в поток стандартного ввода порождаемых программ, — если передать функции os.popen флаг режима «w» вместо «r», подразумеваемого по умолчанию, она вернет объект, подключенный к потоку ввода порожденной программы. Все, что мы запишем в этот объект со стороны родительского сценария, окажется в стандартном потоке ввода запущенной программы:
> >> pipe = os.popen(‘python hello—in.py’, ‘w’) # ‘w’- запись в stdin программы
>>> pipe.write(‘Gumby\n’) 6
> >> pipe.close() # символ \n в конце необязателен
> >> open(‘hello—in.txt’).read() # вывод был отправлен в файл
‘Hello Gumby\n’
Функция popen достаточно сообразительна, чтобы выполнить команду оболочки как независимый процесс на платформах, поддерживающих такую возможность. Она принимает необязательный третий параметр, который используется для управления буферизацией записываемого текста, но мы пока не будем затрагивать эту тему.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011