使用 python tqdm 库重定向 stdout 和 stderr

Ain*_*tor 2 python tqdm

我在 Python 中使用 tqdm 来显示控制台进度条。

我有一个来自另一个库的函数,它偶尔会写入 tqdm 循环内的 stdout 和 stderr。我无法破解该函数的源代码。

虽然此文档展示了如何重定向 sys.stdout,但它不容易推广到 stderr,因为我只能将 stdout 或 stderr 之一传递给file=tqdm 中的参数__init__。请参阅此问题及其接受的答案,以获取说明问题的最少代码。

如何同时重定向stdout和 stderr?

wim*_*wim 5

Python 在标准库中为您提供了一些帮助程序,请查看contextlib

\n\n
>>> import io, sys\n>>> from contextlib import redirect_stdout, redirect_stderr\n>>> from tqdm import tqdm\n>>> def foo():\n...     print(\'spam to stdout\')\n...     print(\'spam to stderr\', file=sys.stderr)\n...     \n>>> out = io.StringIO()\n>>> err = io.StringIO()\n>>> with redirect_stdout(out), redirect_stderr(err):\n...     for x in tqdm(range(3), file=sys.__stdout__):\n...         print(x)  # more spam\n...         foo()\n...         \n100%|\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88| 3/3 [00:00<00:00, 29330.80it/s]\n>>> out.getvalue()\n\'0\\nspam to stdout\\n1\\nspam to stdout\\n2\\nspam to stdout\\n\'\n>>> err.getvalue()\n\'spam to stderr\\nspam to stderr\\nspam to stderr\\n\'\n
Run Code Online (Sandbox Code Playgroud)\n