如何解决在 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 举报,一经查实,本站将立刻删除。