如何理解python中的sys.stdout和sys.stderr
我有以下简单的python代码如何理解python中的sys.stdout和sys.stderr,python,Python,我有以下简单的python代码 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语句中存在异常,我们也会始终返回
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中使用
print()
时,文本将写入Python的sys.stdout
。执行input()
时,它来自sys.stdin
。异常会写入sys.stderr
您可以重新分配这些变量,以便将代码的输出重定向到stdout以外的文件。如果你熟悉的话,这很类似于。您这样做的原因可能是为了保存程序输出的日志或使代码“闭嘴”,即不将输出发送到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.\uu stdin.\uuuu
和sys.\uu stdout.\uuu
,它们始终保持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
和\uuuuuuuuuuu
的原因主要是为了方便,因此不必创建变量来备份stdout
然而,我不得不建议你不要养成重新分配标准输出的习惯。这样很容易把事情搞砸!如果要保存代码的输出,可以使用shell重定向。如果希望能够记录程序正在执行的操作,请参阅Python模块。如果希望代码更安静,请为函数指定一个quiet=False
参数,以便在需要时关闭它们!很少有“真正的”需要执行重新分配stdout
,等等。Python允许您这样做,因为Python给了程序员很多控制权,并期望他们负起责任。如果你真的想做的话,你可以这样做:
>>> import random
>>> random.random = lambda: 1
>>> random.random()
1
>>> random.random()
1
不管在什么情况下发生了什么?现在还不清楚你在问什么或想做什么对不起,让人困惑。我还是不明白。那么,python中的'sys.stdin'和'sys.u stdin'有什么区别?我用更多信息更新了答案。我不小心给了你坏消息。。。这是\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu!另外,区别在于print()
使用stdout
,并且\uuuu stdout\uuuu
作为备份,以防您“丢失”原始值。请帮助我了解何时将内容写入屏幕。您说“异常被写入sys.stderr”。但是,当我的代码崩溃时,它总是打印到终端……这是否意味着显示到终端的内容来自sys.err
和sys.stdout
?