Python中错误流重定向到文件未按预期生效问题求助
问题原因
你测试的两种重定向写法本身是有效的,遇到的空文件问题属于文件IO默认缓冲机制导致的正常现象,不属于Python 3.10的版本bug。
Python对普通文本模式打开的文件默认开启全缓冲策略,只有当缓冲区满、主动调用flush()方法、或者文件被正常关闭时,缓冲区内的内容才会写入磁盘。你的代码抛出未捕获的异常后,Python解释器会直接终止运行,打开的log文件没有执行 flush/close 操作,缓冲的错误信息还没来得及写入磁盘就被丢弃了,所以文件始终为空。
可行解决方案
- 方案1:打开文件时启用行缓冲
给open方法传入buffering=1参数开启行缓冲,每写入一行内容就会自动刷入磁盘,不需要手动控制:import sys file = open("log", "w", buffering=1) sys.stderr = file # 以下两种重定向写法都可以正常生效 # sys.stderr.write = file.write variable - 方案2:捕获异常后手动刷缓冲
用try-except捕获所有异常,输出错误信息后手动调用flush方法写入磁盘:import sys, traceback file = open("log", "w") sys.stderr = file try: variable except Exception: # 输出完整异常栈,和默认stderr输出格式完全一致 traceback.print_exc() sys.stderr.flush() - 方案3:用上下文管理器管理文件生命周期
使用with语法打开文件,代码块执行结束后不管是否抛出异常,都会自动关闭文件触发缓冲写入,不需要手动处理资源回收:import sys, traceback with open("log", "w") as f: sys.stderr = f try: variable except Exception: traceback.print_exc()
内容的提问来源于stack exchange,提问作者Devyansh
相关产品推荐
相关产品推荐

