如何理解Python中的sys.stdout和sys.stderr

6 人关注

我有以下简单的Python代码。

stdout = sys.stdout
stderr = sys.stderr
   # Omitted
finally:
  sys.stdout = stdout

经过搜索,我发现sys.stdin, sys.stdout,以及sys.stderr是文件对象,对应于解释器的标准输入, 标准输出标准误差流。所以,我的猜测是,我们先把sys.stdoutsys.stderr对变量stdoutstderr.

那么,即使有例外情况,在try语句,我们是否可以一直得到sys.stdout背?这样做正确吗?我觉得我还是很困惑。

1 个评论
pvg
不管在什么情况下发生了什么?不清楚你在问什么或想达到什么目的
python
ntough
ntough
发布于 2015-07-15
1 个回答
brenns10
brenns10
发布于 2015-07-15
已采纳
0 人赞同

在正常的C语言程序中,有三个默认打开的 "文件":stdin、stdout和stderr。 当你在C语言中进行输入和输出时,默认情况下它们来自stdin和stdout。 但是,你也可以在代码期待文件的地方使用它们,或者将它们重新分配为新文件。

当你在Python中 print() 时,你的文本被写到Python的 sys.stdout 。 当你做 input() 时,它来自 sys.stdin 。 异常情况会被写到 sys.stderr

你可以重新分配这些变量,以便将你的代码的输出重定向到stdout以外的文件。 这非常类似于 shell redirection 如果你熟悉这个的话。 你之所以要做这样的事情,是为了记录程序的输出,或者让代码 "闭嘴",即不向stdout发送输出。 因此,在你的例子中。

stdout = sys.stdout
    sys.stdout = open('file.txt', 'w')
    print('blah')
    # etc
finally:
    sys.stdout.close()  # close file.txt
    sys.stdout = stdout
    sys.stderr = stderr

这段代码不会向控制台打印任何东西,但它会把 "blah "写到一个名为file.txt的文本文件中。 为了使这种事情不容易出错,Python 提供了sys.__stdin__sys.__stdout__,它们总是保持着sys.stdinsys.stdout的原始值。 使用这个可以使上面的代码更简单。

sys.stdout = open('file.txt', 'w') print('blah') # etc finally: sys.stdout.close() # close file.txt sys.stdout = sys.__stdout__

Python同时有stdout__stdout__的原因主要是为了方便,所以你不需要做一个变量来支持stdout

However,我必须建议你不要养成重新分配stdout的习惯。 这样做很容易把事情弄得一团糟! 如果你想保存你的代码的输出,你可以使用shell重定向。 如果你想有能力保持你的程序在做什么的日志,请参阅 Python 的logging模块。 如果你想让你的代码更安静,给你的函数一个quiet=False的参数,这样你就可以在你想的时候让它们闭嘴了 很少有 "真正 "需要做重赋stdout等的情况。 Python 允许你这样做,因为 Python 给了程序员很多的控制权,并希望他们能负责任。 你可以做这样的事情,如果你真的想的话。

>>> import random
>>> random.random = lambda: 1