gpt4 book ai didi

python - 如何理解 Python 中的 sys.stdout 和 sys.stderr

转载 作者:行者123 更新时间:2023-12-03 22:47:19 28 4
gpt4 key购买 nike

我有以下简单的 Python 代码。

stdout = sys.stdout
stderr = sys.stderr

try:
# Omitted

finally:
sys.stdout = stdout
搜索后发现sys.stdin、sys.stdout、sys.stderr是解释器的 standard input对应的文件对象, standard outputstandard error流。所以,我的猜测是我们首先将 sys.stdout 和 sys.stderr 分配给变量 stdout 和 stderr。
那么,即使 try 语句中有异常,我们总能把 sys.stdout 取回来吗?它是否正确?我觉得我还是很困惑。

最佳答案

在普通的 C 程序中,默认打开三个"file":stdin、stdout 和 stderr。当您在 C 中进行输入和输出时,默认情况下它们来自标准输入和标准输出。但是,您也可以在代码需要文件的地方使用它们,或者将它们重新分配为新文件。

Python 试图“模仿” C 的这种行为。当你 print()在 Python 中,您的文本被写入 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

关于python - 如何理解 Python 中的 sys.stdout 和 sys.stderr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31420317/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com