理解stdin、stdout和stderr

19

我试图理解 stdinstdoutstderr

我经常在别人的代码中看到它们的使用,但无法准确理解它们的含义。我猜想它们与输入/输出有关,但在网上搜索了很多,仍然找不到合适的解释。请问是否有好的链接解释这些概念,或者如果能简单解释一下就更好了。

由于我正在学习 Python 3,相关示例会很有帮助。


这些与shell有关,而不是Python。 - Ashwini Chaudhary
阅读这篇文章是一个很好的开始。之后如果有任何问题,请随时提出。 - loopbackbee
4
@AshwiniChaudhary所说的不是shell,而是终端。 - kojiro
我修改了你的问题,并删除了 Python 部分,因为这不是 Python 特定的内容;但后来我意识到有人已经用 Python 回答了这个问题,所以我在你的问题中添加了一行。仍然不需要标记为 Python。 - Burhan Khalid
@kojiro 终端只是一个运行 shell 的应用程序,在最终交互内核的仍然是 shell。 - Ashwini Chaudhary
@AshwiniChaudhary Shell不提供标准流,也不需要参与应用程序和这些流之间的交互。 - kojiro
2个回答

7
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表示写入。


3

这个文档 (链接) 能解释得清楚吗?

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?'

“what is your name”将被发送到stdout,无论它是什么。如果您没有进行任何重定向,则默认为您正在使用的终端。您可以以不同的方式与标准流进行交互,例如:
sys.stdout.flush()

告诉Python shell强制将我打印的任何缓冲信息立即发送到标准输出(stdout)。

好的,所以命令行上的输入在程序中被分配给sys.stdout了? - Alex Mollberg
1
@AlexMollberg - 不完全是这样。你在命令行上输入的内容会被传递给正在运行的程序的stdin流。你打印出来的东西会被输出到stdout...例如,print "hello"这一行并没有告诉程序要将它打印到哪里,它只是被输出到了stdout,如果你没有进行任何重定向,那么它就是终端(显示在屏幕上)。 - Mike
我有点困惑:如果默认情况下打印的信息都会进入stdout,那么“任何缓冲的信息都将立即发送到stdout”是什么意思呢?如果是这样的话,那么sys.stdout.flush()的作用是什么呢? - JinSnow
默认情况下,打印信息会输出到 stdout,但只有在准备好时才会这样做。打印操作很耗费时间,因此不会立即执行,而是将信息缓存起来,然后在系统确定应该打印时再进行打印。这可能发生在系统空闲时或缓冲区中有足够的内容时。强制执行打印操作的方法是使用 flush 操作。 - Mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接