Python 同步 stdout 和 stderr 输出

2023-11-22

使用以下代码:

import sys

print("INFO", flush=True, file=sys.stdout)
print("ERROR", flush=True, file=sys.stderr)

有时输出是:

ERROR
INFO

有时

INFO
ERROR

如何才能让它始终按照代码中编写的顺序打印呢?


using flush=True只使Python将其“应用程序缓冲区”中的数据刷新到“操作系统缓冲区”,但它不能确保操作系统缓冲区被刷新到磁盘/屏幕。

如果您将结果输出到文件(或使用一些 IDE),那么为了刷新这些缓冲区,您必须使用以下命令发出系统调用os.fsync它调用操作系统将其自己的缓冲区刷新到最终目的地(磁盘/屏幕),这是一个缓慢的操作,涉及系统调用,因此不应在每次打印后不小心使用它。

import sys
import os

print("INFO", flush=True, file=sys.stdout)
os.fsync(sys.stdout.fileno())
print("ERROR", flush=True, file=sys.stderr)
os.fsync(sys.stderr.fileno())

如果你在终端中运行它,你应该换行os.fsync在 try/ except 块中OSError(最好与contextlib.suppress(OSError)).

请注意,某些 IDE 实现了自己的读取文件描述符的逻辑,因此它可能不适用于所有 IDE。

对于 linux/macos 上的 pycharm 有一个2013年报告的错误,至今仍未修复关于这个问题(因为它实际上无法修复),一种解决方法是将 stderr 定向到 stdout,并失去红色着色,这适用于任何手动处理 stdout 缓冲区并因此产生此错误的 IDE。 (或者休眠 1 毫秒以强制操作系统进行上下文切换,但这不切实际)

import sys
import os
os.dup2(sys.stdout.fileno(),sys.stderr.fileno())  # redirect os stderr buffers to stdout
sys.stderr = sys.stdout  # redirect python stderr buffers to stdout

print("INFO", flush=True, file=sys.stdout)
print("ERROR", flush=True, file=sys.stderr)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 同步 stdout 和 stderr 输出 的相关文章

随机推荐