Перенаправление потоков ввода-вывода в файлы и программы

perenapravlenie potokov vvoda vyvoda v fajly i programmy Контекст выполнения сценариев

Теоретически, текст, который выводится в стандартный поток вывода (и с помощью функции print), отображается в окне консоли, в котором запущена программа, текст в стандартный поток ввода (и возвращаемый функцией input) поступает с клавиатуры, а стандартный поток вывода ошибок обычно выводит сообщения об ошибках Python в окно консоли. По крайней мере, так происходит по умолчанию. Существует также возможность перенаправить эти потоки в файлы или в другие программы системной оболочки, а также в произвольные объекты внутри сценария на языке Python. В большинстве систем возможность перенаправления упрощает повторное использование и комбинирование утилит командной строки общего назначения.

Перенаправление удобно использовать, например, для ввода заранее подготовленных тестовых данных: один и тот же сценарий можно протестировать, используя несколько наборов входных данных, просто перенаправляя стандартный поток ввода при каждом запуске сценария в разные файлы. Аналогично перенаправление стандартного потока вывода позволяет сохранить и впоследствии проанализировать вывод программы. Например, в системах тестирования для обнаружения ошибок может выполняться сравнение сохраненного стандартного вывода сценария с файлом, содержащим ожидаемые результаты.

Несмотря на всю мощь этой парадигмы, сам механизм перенаправления весьма прост в использовании. В качестве примера рассмотрим простой цикл «прочесть-вычислить-вывести», представленный в примере 3.5.

Пример 3.5. PP4E\System\Streams\teststreams.py

“читает числа до символа конца файла и выводит их квадраты”

def interact():

print(‘Hello stream world’) # print выводит в sys.stdout while True:

try:

reply = input(‘Enter a number>’) # input читает из sys.stdin except EOFError:

break # исключение при встрече символа eof

else: # входные данные в виде строки

num = int(reply)

print(“%d squared is %d” % (num, num ** 2))

print(‘Bye’)

if __name__ == ‘__main__’:

interact() # если выполняется, а не импортируется

Как обычно, функция interact вызывается автоматически, если файл не импортируется, а выполняется как самостоятельный сценарий. По умолчанию запуск этого файла из командной строки вызывает появление стандартного потока в месте, где вводилась команда. Сценарий просто читает числа, пока не достигнет конца файла в стандартном потоке ввода (в Windows конец файла обычно можно ввести комбинацией двух клавиш Ctrl+Z; в Unix нужно нажать комбинацию Ctrl+D):[VIII]

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

Hello stream world

Enter a number>12

12 squared is 144

Enter a number>10

10 squared is 100 Enter a number>"Z Bye

И в Windows, и в Unix-подобных системах стандартный поток ввода можно перенаправить в файл — с помощью синтаксической конструкции < filename оболочки. Ниже приводится сеанс работы в окне консоли DOS под Windows, где сценарий читает входные данные из текстового файла input.txt. То же самое можно проделать и в Linux, только команду DOS type нужно заменить командой Unix cat:

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

8

6

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

Hello stream world

Enter a number>8 squared is 64

Enter a number>6 squared is 36

Enter a number>Bye

Здесь ввод данных, которые обычно поступают с клавиатуры в интерактивном режиме, автоматизирован с помощью файла input.txt: сценарий читает данные из этого файла, а не с клавиатуры. Точно так же можно перенаправить в файл и стандартный поток вывода — с помощью синтаксической конструкции > filename оболочки. При этом перенаправление ввода и вывода можно объединить в одной команде:

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

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

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

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