how to understand sys.stdout and sys.stderr in python
我有以下简单的python代码。
1 2 3 4 5 6 7 8 | 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? 它是否正确? 我觉得我还是很困惑。 非常感谢您的时间和关注。
在普通的C程序中,默认情况下打开三个"文件":stdin,stdout和stderr。当您在C中输入和输出时,默认情况下它们来自stdin和stdout。但是,您也可以在代码需要文件的地方使用它们,或者将它们重新分配为新文件。
Python试图"模仿"C的这种行为。当你在Python中
您可以重新分配这些变量,以便将代码的输出重定向到stdout以外的文件。这与shell重定向非常相似,如果您熟悉它的话。您可能会执行此类操作的原因是保留程序输出的日志或使代码"关闭",即不将输出发送到stdout。所以,在你的示例中:
1 2 3 4 5 6 7 8 9 10 | 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"写入名为
1 2 3 4 5 6 7 | try: sys.stdout = open('file.txt', 'w') print('blah') # etc finally: sys.stdout.close() # close file.txt sys.stdout = sys.__stdout__ |
Python同时具有
但是,我必须建议您不要重新分配
1 2 3 4 5 6 | >>> import random >>> random.random = lambda: 1 >>> random.random() 1 >>> random.random() 1 |