Автор оригинала: Pankaj Kumar.
Python – Stdin, Stdout и STDERR
Прежде чем пройти через эту статью, давайте понять, какие условия stdin
, stdout
и Стдерр
являются.
Стандартный ввод – Это Ручка-файл что пользовательская программа читает, чтобы получить информацию от пользователя. Мы даем ввод на стандартный вход ( stdin ).
Стандартный выход – Пользовательская программа записывает обычную информацию для этой обработки файла. Вывод возвращается через стандартный выход ( stdout ).
Стандартная ошибка . – Пользовательская программа записывает информацию об ошибке к этой обработке файла. Ошибки возвращаются через стандартную ошибку ( STDERR ).
Python предоставляет нам файловые объекты которые представляют stdin , Stdout, и Стдерр Отказ Давайте посмотрим на то, как мы могли бы работать с этими объектами для работы с входом и выходом нашей программы.
1. Sys.Stdin.
Python’s SYS модуль Предоставляет нам все три файловых объекта для STDIN, STDOUT и STDERR. Для объекта входного файла мы используем Sys.Stdin
Отказ Это похоже на файл, где вы можете открыть и закрыть его, как и любой другой файл.
Давайте понять это через базовый пример:
import sys stdin_fileno = sys.stdin # Keeps reading from stdin and quits only if the word 'exit' is there # This loop, by default does not terminate, since stdin is open for line in stdin_fileno: # Remove trailing newline characters using strip() if 'exit' == line.strip(): print('Found exit. Terminating the program') exit(0) else: print('Message from sys.stdin: ---> {} <---'.format(line))
Выход
Hi Message from sys.stdin: ---> Hi <--- Hello from AskPython Message from sys.stdin: ---> Hello from AskPython <--- exit Found exit. Terminating the program
Вышеуказанный фрагмент продолжает читать вход от stdin
и печатает сообщение на консоль ( stdout
) до слова Выход
встречается.
Примечание : Мы обычно не закрываем по умолчанию stdin
Файл объект, хотя это разрешено. Итак, stdin_fileno.close ()
Допустимый код Python.
Теперь, когда мы немного знаем о stdin
Давайте перейдем к stdout
Отказ
2. Sys.Stdout
Для объекта выходного файла мы используем sys.stdout
Отказ Это похоже на Sys.Stdin
, но он напрямую отображает что-нибудь, написанное ему на консоль.
Приведенный ниже фрагмент показывает, что мы получаем выход на консоль, если мы пишем на sys.stdout
Отказ
import sys stdout_fileno = sys.stdout sample_input = ['Hi', 'Hello from AskPython', 'exit'] for ip in sample_input: # Prints to stdout stdout_fileno.write(ip + '\n')
Выход
Hi Hello from AskPython exit
3. Sys.Stderr.
Это похоже на sys.stdout
Потому что он также печатает непосредственно к консоли. Но разница в том, что это Только Отпечатки Исключения и Сообщения об ошибках Отказ (Вот почему это называется Стандартная ошибка ).
Давайте проиллюстрируем это с примером.
import sys stdout_fileno = sys.stdout stderr_fileno = sys.stderr sample_input = ['Hi', 'Hello from AskPython', 'exit'] for ip in sample_input: # Prints to stdout stdout_fileno.write(ip + '\n') # Tries to add an Integer with string. Raises an exception try: ip = ip + 100 # Catch all exceptions except: stderr_fileno.write('Exception Occurred!\n')
Выход
Hi Exception Occurred! Hello from AskPython Exception Occurred! exit Exception Occurred!
Как вы можете наблюдать, для всех входных строк мы пытаемся добавить в целое число, которое поднимет исключение. Мы ловим все такие исключения и распечатаем другое отладочное сообщение, используя Sys.Stderr
Отказ
Перенаправление в файл
Мы можем перенаправить stdin
, stdout
и Стдерр
Файл обрабатывает в любой другой файл (дескриптор файла). Это может быть полезно, если вы хотите зарегистрировать события в файл без использования какого-либо другого модуля, такого как журнал.
Приведенный ниже фрагмент перенаправляет вывод ( stdout
) в файл под названием Yump.txt
Отказ
Итак, мы не увидим ничего напечатанного к консоли, потому что теперь она печатается к самому файлу! Это сущность выходного перенаправления. Вы «перенаправляете» вывод на некоторое другое место. (На этот раз до output.txt
вместо консоли)
import sys # Save the current stdout so that we can revert sys.stdou after we complete # our redirection stdout_fileno = sys.stdout sample_input = ['Hi', 'Hello from AskPython', 'exit'] # Redirect sys.stdout to the file sys.stdout = open('Output.txt', 'w') for ip in sample_input: # Prints to the redirected stdout (Output.txt) sys.stdout.write(ip + '\n') # Prints to the actual saved stdout handler stdout_fileno.write(ip + '\n') # Close the file sys.stdout.close() # Restore sys.stdout to our old saved file handler sys.stdout = stdout_fileno
Выход
root@ubuntu:~# python3 output_redirection.py Hi Hello from AskPython exit root@ubuntu:~# cat Output.txt Hi Hello from AskPython exit
Как видите, мы напечатали вывод как на консоль, а также для Yump.txt
Отказ
Сначала мы сохраняем оригинал sys.stdout
Объект обработчика файла к другой переменной. Нам не только нужно это восстановить sys.stdout
к старому обработчику (указывая на консоль), но мы также можем печатать на консоли, используя эту переменную!
Обратите внимание, что после записи в файл мы закрываем его, похоже на то, как мы закрываем файл, потому что этот файл все еще был открыт.
Мы наконец восстановим обработчик sys.stdout
на консоль, используя переменную stdout_fileno
Отказ
Подобный процесс можно соблюдать для перенаправления ввода и ошибки, замена sys.stdout
с Sys.Stdin
или Sys.Stderr
и работа с входами и исключениями вместо вывода.
Заключение
В этой статье мы узнали об использовании stdin
, stdout
и Стдерр
в Python, используя sys
модуль. Мы также узнали, как манипулировать соответствующими обработчиками файлов для перенаправления к/из файла.