在常规的C程序中,默认情况下有三个打开的"文件": stdin、stdout和stderr。当您在C中进行输入和输出时,默认情况下它们来自stdin和stdout。但是,您也可以在代码需要文件时使用它们,或重新分配它们以成为新文件。
Python试图“模仿”C的这种行为。当您在Python中使用print()
时,您的文本将被写入Python的sys.stdout
。当您使用input()
时,它来自于sys.stdin
。异常被写入sys.stderr
。
您可以重新分配这些变量,以将代码的输出重定向到除了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"写入名为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
print()
使用stdout
,而__stdout__
作为备用选项存在,以防您“丢失”原始值。 - brenns10sys.err
和sys.stdout
的内容联合? - Charlie Parker