【问题标题】:Understanding stdin stdout stderr [duplicate]了解标准输入标准输出标准错误 [重复]
【发布时间】:2013-01-11 09:35:58
【问题描述】:

我试图理解stdin stdoutstderr

我一直在人们的代码中看到它们,但我无法准确理解它们是什么。我假设他们与输入/输出有关,但一直在网上搜索解释但找不到。有没有人知道一个很好的解释链接,或者它是否足够简单来解释它会对我有很大帮助。

由于我正在学习 Python 3,因此其中的示例会有所帮助。

【问题讨论】:

  • 这些与shell相关,而不是python。
  • 阅读this article 是一个很好的开始。之后请随时提出任何问题。
  • @AshwiniChaudhary 不是外壳,终端
  • 我编辑了您的问题并删除了 Python 部分,因为这不是 Python 特有的;但后来我意识到有人已经用 Python 回答了这个问题,所以我在你的问题中添加了一行。仍然不需要标记为 Python。
  • @kojiro终端只是一个运行shell的应用程序,最终它是与内核交互的shell。

标签: stdout stdin stderr


【解决方案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 表示读取,mode w 表示写入

【讨论】:

    【解决方案2】:

    this 解释得够清楚吗?

    sys.stdin
    sys.stdout
    sys.stderr
    对应于解释器的标准输入、输出和错误流的文件对象。

    标准输入用于除脚本外的所有解释器输入,但包括对 input() 和 raw_input() 的调用。

    stdout 用于 print 和 expression 语句的输出以及 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()
    

    告诉 python shell 强制我 printed 的任何缓冲信息立即转到 stdout

    【讨论】:

    • ok,所以命令行输入分配给程序本身的sys.stdout?
    • @AlexMollberg - 不完全是。您在命令行上提供的输入将提供给正在运行的程序的stdin 流。您打印的内容转到stdout... 例如print "hello" 行不会告诉程序将其打印到哪里,它只是转到stdout,如果您没有进行任何重定向,则终端是终端(显示在显示器上)
    • 好的,现在说得通了。谢谢
    • 我很困惑:any buffered information that I've printed to go to stdout right away 但打印的信息默认进入stdout,对吧?如果是这样,sys.stdout.flush() 的意义何在?
    • 默认情况下,打印的信息会发送到stdout,但前提是它准备好了。打印操作很费时间,因此不会立即完成,但是信息会被缓冲,然后在系统确定应该打印时打印。这可能是在系统暂停期间或缓冲区“足够”时。 强制它的方法是使用flush 操作。
    猜你喜欢
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 2011-11-30
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    相关资源
    最近更新 更多