提问者:小点点

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


我有以下简单的python代码。

stdout = sys.stdout
stderr = sys.stderr

try:
   # omited

finally:
  sys.stdout = stdout

经过搜索,我发现sys.stdin,sys.stdout和sys.stderr是与解释器的标准输入,标准输出和标准错误流相对应的文件对象。因此,我的猜测是,我们首先将sys.stdout和sys.stderr分配给变量stdout和stderr。然后,即使try语句中有异常,我们调用总是得到sys.stdout?这是正确的吗?我觉得我还是很迷茫。非常感谢您的时间和关注。


共1个答案

匿名用户

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

Python试图“模仿”C的这种行为。当您在Python中时,您的文本被写入Python的。当您执行时,它来自。异常被写入

您可以重新分配这些变量,以便将代码的输出重定向到stdout以外的文件。这与shell重定向非常相似,如果您熟悉的话。这样做的原因是为了记录程序的输出,或者使代码“关闭”,即不将输出发送到stdout。因此,在您的示例中:

stdout = sys.stdout

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

该代码不会将任何内容打印到控制台,但它会将“blah”写入名为的文本文件。为了使这种事情不那么容易出错,Python提供了,它们始终保存原始值。上面的代码可以通过以下方式变得更简单:

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

Python同时具有的原因主要是为了方便起见,因此您不必为备份创建一个变量。

但是,我必须建议您不要养成重新分配的习惯。那样很容易把事情搞砸!如果您想保存代码的输出,可以使用shell重定向。如果您希望能够记录程序正在执行的操作,请参阅Python的日志模块。如果您希望代码更安静,可以给函数一个参数,这样您就可以在需要的时候关闭它们!很少“真正”需要执行ressign等。Python允许您这样做,因为Python给予程序员很大的控制权,并期望他们负责任。你可以这样做,如果你真的想:

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