Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何理解python中的sys.stdout和sys.stderr_Python - Fatal编程技术网

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

如何理解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语句中存在异常,我们也会始终返回

我有以下简单的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语句中存在异常,我们也会始终返回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