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