Рубрики
Без рубрики

Python – Stdin, Stdout и STDERR

Прежде чем пройти через эту статью, давайте понять, какие условия stdin, Stdout и Stderr есть.

Автор оригинала: 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 модуль. Мы также узнали, как манипулировать соответствующими обработчиками файлов для перенаправления к/из файла.

использованная литература