在普通的C程序中,有三个默认打开的“文件”:stdin、stdout和stderr。在C语言中输入和输出时,默认情况下它们来自stdin和stdout。但是,也可以在代码需要文件的地方使用它们,或者将它们重新分配为新文件。
Python试图“模仿”C的这种行为。当您在Python中print()时,您的文本将被写入Python的sys.stdout。当你做input()时,它来自sys.stdin。异常被写入sys.stderr。
可以重新分配这些变量,以便将代码输出重定向到stdout以外的文件。这与shell redirection非常相似,如果您熟悉的话。您可能这样做的原因是要保留程序输出的日志或使代码“关闭”,即不将输出发送到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
这段代码不会向控制台打印任何内容,但它会向名为file.txt的文本文件写入“blah”。为了减少此类错误的发生,Python提供了sys.__stdin__和sys.__stdout__,它们始终保持sys.stdin和sys.stdout的原始值。使用以下方法可以简化上述代码:try:
sys.stdout = open('file.txt', 'w')
print('blah')
# etc
finally:
sys.stdout.close() # close file.txt
sys.stdout = sys.__stdout__
Python同时拥有stdout和__stdout__的原因主要是为了方便起见,所以不必创建变量来备份stdout。
但是,我不得不建议你不要养成重新分配的习惯。这样把事情搞砸很容易!如果要保存代码的输出,可以使用shell重定向。如果希望能够记录程序正在执行的操作,请参阅Python的logging模块。如果你想让你的代码更安静,给你的函数一个quiet=False参数,这样你就可以在需要的时候关闭它们!很少有“真正的”需要重新分配stdout等。Python允许您这样做,因为Python给了程序员很多控制权,并希望他们负责。你可以这样做,如果你真的想:>>> import random
>>> random.random = lambda: 1
>>> random.random()
1
>>> random.random()
1