我有一个 tqdm 进度条:
print('foo')
for status in tqdm(cursor.items(count)):
#process status
pass
我在循环之前打印了一些消息,但进度条显示在它们之前。是否有任何类型的多线程或我该如何解决这个问题?
问题是print
默认打印到sys.stdout
,而tqdm
默认打印到sys.stderr
,这使得它们不同步。
您可以指定file=sys.stdout
totqdm
或指定file=sys.sterr
toprint
使两者都打印到同一个流,或者您可以在每次调用sys.stdout.flush
之前和sys.stderr.flush
之后调用tqdm
.
我可以报告报告的几个解决方案如何在 Windows 10 上为我工作。我也遇到了 tqdm 的条形输出被 tqdm 之前执行的打印中断的问题。对我有用的解决方案是
sys.stdout.flush()
没有的是添加到印刷品中
flush=True
我认为 sys.stdout.flush 是最好的,因为它正是需要做的...... stdout 上的输出需要被刷新,以便在 tqdm 在 stderr 上的第一个输出之前完成......基本的 I/O 问题。
我喜欢这个小部件为原本无聊的 stdio 世界带来一点优雅的能力。
tqdm 在线程中工作(这很好,因为应用程序不会因为进度条而卡住),因此进度条显示在打印之前。
由于机器认为打印是一个 IO 动作,所以机器优先考虑 tqdm。
您需要在循环之前和之后睡觉。为此,请time.sleep(x)
在循环前后使用 (x is in seconds) 来停止问题。请记住import time
在代码的开头。尝试使用不同的 x 值,但只有 0.1 可能会正常工作。