Python sys.stdout缓冲问题:如何实现每行实时写入文件?
解决方案
步骤1:调整代码(仅修改非main函数部分)
保留main()函数完全不动,移除代码中手动替换sys.stdout/sys.stderr的逻辑,让输出默认走系统标准输出/错误流:
import sys import time def main(): for i in range(100): print("One line every 2s", end = "\n") time.sleep(2) if __name__ == '__main__': # 移除原有的文件重定向逻辑,直接执行main main()
步骤2:通过Bash命令运行并重定向输出
使用python -u参数强制Python禁用标准输出缓冲,同时通过Bash重定向将输出写入目标文件:
python -u your_script.py > log.out 2> log.err
原理说明
python -u会让Python的默认标准输出/错误流变为无缓冲模式,每次print调用后立即刷新输出。- Bash重定向
>和2>会将进程的标准输出、标准错误分别写入log.out和log.err,结合-u参数就能实现每行输出实时写入文件。
之前的方法无效是因为代码中手动将sys.stdout替换为了自己打开的文件对象,python -u和PYTHONUNBUFFERED仅对Python默认的标准输出流生效,无法影响手动创建的文件对象的缓冲行为。
内容的提问来源于stack exchange,提问作者dave
相关产品推荐
相关产品推荐

