在正常的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.stdin
和sys.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