微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Python 中使用 with 语句时,将 stderr 和 stdout 重定向到文件不会写入错误

如何解决在 Python 中使用 with 语句时,将 stderr 和 stdout 重定向到文件不会写入错误

我有一个程序可以将输出错误重定向一个日志文件,这样我就可以在它自动运行时查看它。它运行良好,直到我从使用 open()close() 方法切换到使用 with 语句。

我原来是:

import sys
log = open("log.txt","w",encoding="utf-8")
sys.stdout = sys.stderr = log
print("hello world")
print(1 / 0)
print("goodbye world")
log.close()

输出了我所期望的:

hello world
Traceback (most recent call last):
  File "testing.py",line 5,in <module>
    print(1 / 0)
ZeroDivisionError: division by zero

但是当我把它改成:

import sys
with open("log.txt",encoding="utf-8") as log:
    sys.stdout = sys.stderr = log
    print("hello world")
    print(1 / 0)
    print("goodbye world")

文件显示

hello world

我不熟悉这两种方法间的区别(除了第二种方法让它更容易阅读)所以我的问题是:为什么 with 语句无法记录错误并且存在一种在保留 with 语句的同时记录错误方法

解决方法

发生这种情况是因为 with 语句在它可以写入错误输出之前关闭了资源,因为发生了异常。 在 docs 中查看它。

以下代码:

with EXPRESSION as TARGET:
    SUITE

在语义上等同于:

manager = (EXPRESSION)
enter = type(manager).__enter__
exit = type(manager).__exit__
value = enter(manager)
hit_except = False

try:
    TARGET = value
    SUITE
except:
    hit_except = True
    if not exit(manager,*sys.exc_info()):
        raise
finally:
    if not hit_except:
        exit(manager,None,None)

第一种情况之所以处理异常,是因为python退出时资源被关闭,而不是因为close语句。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。