Понимание stdin stdout stderr
Я пытаюсь понять stdin
stdout
и stderr
.
Я вижу, что они всегда используются в коде людей, и я не могу точно понять, что они собой представляют. Я предполагаю, что они имеют какое-то отношение к вводу/выводу, но ищут объяснения в Интернете и не могут их найти. Кто-нибудь знает о хорошей связи с объяснением или если это достаточно просто, чтобы объяснить, это будет большой помощью для меня.
Поскольку я изучаю Python 3, примеры в этом будут полезны.
Ответы
Ответ 1
sys.stdin
sys.stdout
sys.stderr
Файловые объекты, используемые интерпретатором для стандартного ввода, вывода и ошибок:
-
stdin
используется для всех интерактивных входов (включая вызовы input()
);
-
stdout
используется для вывода print()
и операторов выражения и для приглашений input()
;
-
Собственные подсказки интерпретаторов и сообщения об ошибках отправляются на stderr
.
Для вашего понимания:
>>> import sys
>>> for i in (sys.stdin, sys.stdout, sys.stderr):
... print i
...
<open file '<stdin>', mode 'r' at 0x103451150>
<open file '<stdout>', mode 'w' at 0x1034511e0>
<open file '<stderr>', mode 'w' at 0x103451270>
mode r
означает чтение и режим w
означает запись
Ответ 2
Может ли это объяснить это достаточно хорошо?
sys.stdin
sys.stdout
sys.stderr
Файловые объекты, соответствующие стандартным входным, выходным и потоковым сообщениям интерпретаторов.
stdin используется для ввода всех интерпретаторов, кроме сценариев, но включает вызовы input() и raw_input().
stdout используется для вывода операторов печати и выражения и для запросов ввода() и raw_input().
У интерпретаторов собственные запросы и (почти все) сообщения об ошибках отправляются в stderr.
stdout и stderr не должны быть встроенными файловыми объектами: любой объект является допустимым, если он имеет метод write(), который принимает строковый аргумент.
(Изменение этих объектов не влияет на стандартные потоки ввода-вывода процессов, выполняемых os.popen(), os.system() или семейством функций exec *() в модуле os.)
Подтвердить
если я скажу оболочке python выполнить печать:
print 'what is your name?'
"как ваше имя" пойдет на stdout
, что бы это ни было. Если вы не сделали никаких переадресаций, которые по умолчанию используют терминал. Вы можете взаимодействовать со стандартными потоками различными способами, например:
sys.stdout.flush()
Сообщает оболочке python, чтобы заставить любую буферизованную информацию, что я print
ed, перейти к stdout
сразу.