我tqdm
在 Python 中使用在我们的脚本中显示控制台进度条。但是,我还必须调用print
向控制台发送消息且无法更改的函数。通常,在控制台中显示进度条的同时写入控制台会使显示混乱,如下所示:
from time import sleep
from tqdm import tqdm
def blabla():
print "Foo blabla"
for k in tqdm(range(3)):
blabla()
sleep(.5)
这将创建输出:
0%| | 0/3 [00:00<?, ?it/s]Foo
blabla
33%|###########6 | 1/3 [00:00<00:01, 2.00it/s]Foo
blabla
67%|#######################3 | 2/3 [00:01<00:00, 2.00it/s]Foo
blabla
100%|###################################| 3/3 [00:01<00:00, 2.00it/s]
根据tqdm
该方法的文档tqdm.write()
提供了一种在不破坏显示的进度条的情况下将消息写入控制台的方法。因此,此代码段提供了正确的输出:
from time import sleep
from tqdm import tqdm
def blabla():
tqdm.write("Foo blabla")
for k in tqdm(range(3)):
blabla()
sleep(.5)
看起来像这样:
Foo blabla
Foo blabla
Foo blabla
100%|###################################| 3/3 [00:01<00:00, 1.99it/s]
另一方面,有一种解决方案允许通过非常优雅地重定向sys.stdout
到虚空来使这些功能静音。这对于使功能静音非常有效。
由于我想在不破坏进度条的情况下显示来自这些函数的消息,因此我尝试通过重定向sys.stdout
到旧的. 这导致了代码段:tqdm.write()
tqdm.write()
sys.stdout
from time import sleep
import contextlib
import sys
from tqdm import tqdm
class DummyFile(object):
file = None
def __init__(self, file):
self.file = file
def write(self, x):
tqdm.write(x, file=self.file)
@contextlib.contextmanager
def nostdout():
save_stdout = sys.stdout
sys.stdout = DummyFile(save_stdout)
yield
sys.stdout = save_stdout
def blabla():
print "Foo blabla"
for k in tqdm(range(3)):
with nostdout():
blabla()
sleep(.5)
但是,这实际上会像以前一样创建一个更加混乱的输出:
0%| | 0/3 [00:00<?, ?it/s]Foo
blabla
33%|###########6 | 1/3 [00:00<00:01, 2.00it/s]Foo
blabla
67%|#######################3 | 2/3 [00:01<00:00, 2.00it/s]Foo
blabla
100%|###################################| 3/3 [00:01<00:00, 2.00it/s]
tqdm.write(..., end="")
仅供参考:在内部调用DummyFile.write()
会产生与仍然混乱的第一个输出相同的结果。
我不明白为什么这不起作用,因为tqdm.write()
应该在编写消息之前管理清除进度条,然后重写进度条。
我错过了什么?