Доброго времени суток, читатели, зрители моего канала programmer's notes.
Приложение к видео
Файлы и перенаправление в Python
Когда мы говорим о файлах, то следует различать файлы, как объекты хранящиеся в файловой системе и объекты, которые мы создаём в программе и которые связаны с первыми объектами. В большинстве случаев при программировании мы пользуемся библиотеками, которые закрывают от нас возможности операционной системы, предоставляя нам свою интерпретацию. В следующих уроках мы как раз и перейдём к таким технологиям.
Особенностью операционной системы Linux является то, что изначально всё что может передаваться в виде данных рассматриваются как файлы. Соответственно к ним может быть применён такой инструмент как перенаправление. В частности как файлы могут рассматриваться стандартные каналы ввода-вывода: ввода с клавиатуры и вывода на стандартный терминал.
И вот именно здесь появляется возможность непосредственно из программы на Python получать средство напрямую использовать возможности операционной системы. В Linux стандартные каналы ввода-вывода пронумерованы:
- 0 - ввод с клавиатуры;
- 1 - вывода на консоль;
- 2 - вывод сообщений об ошибках.
Каналы 1 и 2 выводят на консоль, но их можно разделить (см. ниже) . Для того, чтобы поэкспериментировать с каналами ввода и вывода на предмет перенаправления, рассмотрим очень простую программу.
Назовём её py1.py. При обычном запуске она спрашивает два числа с клавиатуры и выводит результат, их произведение. Запуск в консоли осуществляется известной в linux командой
./py1.py.
имея в виду запуск из каталога, где содержится данная программа.
При вводе чисел, результат выводится на консоль. Если при вводе происходит ошибка, например вводится строка, не являющейся число, то на консоль выводится сообщение об ошибке интерпретатора Python. Всё это, я уверен для моих читателей очевидно. Замечу только, что вывод результата работы программы и вывод об ошибке выводится по разным каналам (sic!).
Попробуем теперь перенаправить ввод с клавиатуры. Создадим текстовый файл in и поместим туда два числа, каждое в своей строке. Например так
10
3
Тогда можно записать
./py1.py < in
И программа даст верный результат, как если бы мы ввели оба эти числа с клавиатуры. Т.е. диалоговый ввод с клавиатуры можно легко заменить вводом их файла. Это очень важная вещь, например, для проверки программы на основе большого количества тестов.
Для перенаправления вывода в файл, как вы ужу, наверное, понимаете, нужно использовать обратный знак '>'.
Например так
./py1.py >out
или так
./py1.py <in >out
При этом, результат выполнения выводится в файл out.
Если же в результате выполнения программы возникает ошибка, то сообщение об ошибки выводится по-прежнему на консоль. Если же мы хотим, что программа и в случае ошибки выводила сообщение в файл, то можно воспользоваться таким вариантом
./py1.py <in 1>out 2>err
Тогда оба канала вывода будут выводить данные в разные файлы.
Замечание
Особенность перенаправления '>' заключается в том. что текстовый файл обнуляется перед тем, как туда будут помещены файлы. Чтобы добавлять данные в конец текстового файла, сохраняя его предыдущее содержимое, нужно использовать '>>'.
Всего наилучшего. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.