使用python TQM库重定向stdout和stderr

使用python TQM库重定向stdout和stderr,python,tqdm,Python,Tqdm,我在Python中使用TQM来显示控制台进度条 我有一个来自另一个库的函数,它偶尔会在TQM循环中写入stdout和stderr。我无法破解该函数的源代码 虽然演示了如何重定向sys.stdout,但它并不容易推广到stderr,因为我只能将stdout或stderr中的一个传递到TQM的\uuu init\uuuu中的文件=参数。有关说明问题的最低代码,请参阅及其 如何将stdout和stderr一起重定向?Python在标准库中为您提供了一些帮助,请查看: 导入io,系统 >>>从conte

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

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

虽然演示了如何重定向sys.stdout,但它并不容易推广到stderr,因为我只能将stdout或stderr中的一个传递到TQM的
\uuu init\uuuu
中的
文件=
参数。有关说明问题的最低代码,请参阅及其


如何将stdout和stderr一起重定向?

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

导入io,系统 >>>从contextlib导入重定向\u stdout,重定向\u stderr >>>从TQM导入TQM >>>def foo(): ... 打印('spam to stdout') ... 打印('spam to stderr',file=sys.stderr) ... >>>out=io.StringIO() >>>err=io.StringIO() >>>使用redirect_stdout(out),redirect_stderr(err): ... 对于tqdm中的x(范围(3),file=sys.\uuu stdout\uuu): ... 打印(x)#更多垃圾邮件 ... foo() ... 100%|██████████| 3/3[00:00>>out.getvalue() “0\nspam到标准输出\n1\nspam到标准输出\n2\nspam到标准输出\n” >>>err.getvalue() '垃圾邮件发送到stderr\nspam发送到stderr\nspam发送到stderr\n'
谢谢你的回答,但这并不容易。如果你看看我发布的示例链接,你会发现tqdm与sys.stdout/stderr的交互方式非常复杂。在这种情况下,你能不能生成一个。MCVE在I linked中。它还包含一个关于如何重定向stdout的解决方案,在我的实验中效果很好我所要做的就是重定向出代码并出错。除了stdout之外,你链接的答案看起来像是做我上面展示的事情的一种糟糕的方式。contextlib重定向对我很有效,正确地捕获了
tqdm
中的所有内容。如果它对你不起作用,请描述如何(即,你仍然需要一个MCVE)不,正如我所说,这不是一个简单的重定向。你不能只在开始时保存stdout/stderr,然后在结束时还原它们。TQM在幕后做了很多工作。我链接的答案也在中。你的解决方案以字符串形式捕获所有内容,这不是进度条的本意。
>>> import io, sys
>>> from contextlib import redirect_stdout, redirect_stderr
>>> from tqdm import tqdm
>>> def foo():
...     print('spam to stdout')
...     print('spam to stderr', file=sys.stderr)
...     
>>> out = io.StringIO()
>>> err = io.StringIO()
>>> with redirect_stdout(out), redirect_stderr(err):
...     for x in tqdm(range(3), file=sys.__stdout__):
...         print(x)  # more spam
...         foo()
...         
100%|██████████| 3/3 [00:00<00:00, 29330.80it/s]
>>> out.getvalue()
'0\nspam to stdout\n1\nspam to stdout\n2\nspam to stdout\n'
>>> err.getvalue()
'spam to stderr\nspam to stderr\nspam to stderr\n'