我试图理解 stdin
、stdout
和 stderr
。
我经常在别人的代码中看到它们的使用,但无法准确理解它们的含义。我猜想它们与输入/输出有关,但在网上搜索了很多,仍然找不到合适的解释。请问是否有好的链接解释这些概念,或者如果能简单解释一下就更好了。
由于我正在学习 Python 3,相关示例会很有帮助。
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>
模式r
表示读取,模式w
表示写入。
这个文档 (链接) 能解释得清楚吗?
sys.stdin
sys.stdout
sys.stderr
对应于解释器标准输入、输出和错误流的文件对象。
stdin 用于除脚本外所有解释器输入,包括对 input() 和 raw_input() 的调用。
stdout 用于打印和表达式语句的输出以及 input() 和 raw_input() 的提示信息。
解释器自己的提示信息(以及几乎所有)的错误消息都会发送到 stderr。
stdout 和 stderr 不必是内置的文件对象:只要它具有一个接受字符串参数的 write() 方法,任何对象都可以使用。
(更改这些对象不会影响 os.popen()、os.system() 或 os 模块中 exec*() 函数执行的进程的标准 I/O 流。)
为了澄清:
如果我告诉 Python shell 执行打印操作:
print 'what is your name?'
stdout
,无论它是什么。如果您没有进行任何重定向,则默认为您正在使用的终端。您可以以不同的方式与标准流进行交互,例如:sys.stdout.flush()
stdin
流。你打印出来的东西会被输出到stdout
...例如,print "hello"
这一行并没有告诉程序要将它打印到哪里,它只是被输出到了stdout
,如果你没有进行任何重定向,那么它就是终端(显示在屏幕上)。 - Mikestdout
,但只有在准备好时才会这样做。打印操作很耗费时间,因此不会立即执行,而是将信息缓存起来,然后在系统确定应该打印时再进行打印。这可能发生在系统空闲时或缓冲区中有足够的内容时。强制执行打印操作的方法是使用 flush
操作。 - Mike
shell
有关,而不是Python。 - Ashwini Chaudhary