【发布时间】:2016-08-27 11:35:46
【问题描述】:
我在 Python 中使用tqdm 在我们的脚本中显示控制台进度条。
但是,我也必须将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]
According to the documentation of tqdmtqdm.write() 方法提供了一种在不破坏显示进度条的情况下将消息写入控制台的方法。
因此,这个 sn-p 提供了正确的输出:
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]
另一方面,solution which permits to silence those functions 非常优雅地将sys.stdout 重定向到虚空中。
这对于使函数静音非常有效。
由于我想在不破坏进度条的情况下显示来自这些函数的消息,我尝试通过将sys.stdout 重定向到tqdm.write() 并反过来让tqdm.write() 写入旧 sys.stdout。
这导致 sn-p:
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]
仅供参考:在 DummyFile.write() 内调用 tqdm.write(..., end="") 会创建与第一个输出相同的结果,但仍然是混乱的。
我不明白为什么这不起作用,因为tqdm.write() 应该在编写消息之前管理清除进度条,然后重写进度条。
我错过了什么?
【问题讨论】:
标签: python python-2.7 tqdm