6

我有一个 tqdm 进度条:

print('foo')
for status in tqdm(cursor.items(count)):
    #process status
    pass

我在循环之前打印了一些消息,但进度条显示在它们之前。是否有任何类型的多线程或我该如何解决这个问题?

4

3 回答 3

3

问题是print默认打印到sys.stdout,而tqdm默认打印到sys.stderr,这使得它们不同步。

您可以指定file=sys.stdouttotqdm或指定file=sys.sterrtoprint使两者都打印到同一个流,或者您可以在每次调用sys.stdout.flush之前和sys.stderr.flush之后调用tqdm.

于 2017-07-23T16:03:50.930 回答
1

我可以报告报告的几个解决方案如何在 Windows 10 上为我工作。我也遇到了 tqdm 的条形输出被 tqdm 之前执行的打印中断的问题。对我有用的解决方案是

sys.stdout.flush()

没有的是添加到印刷品中

flush=True

我认为 sys.stdout.flush 是最好的,因为它正是需要做的...... stdout 上的输出需要被刷新,以便在 tqdm 在 stderr 上的第一个输出之前完成......基本的 I/O 问题。

我喜欢这个小部件为原本无聊的 stdio 世界带来一点优雅的能力。

于 2017-10-19T00:23:34.247 回答
-1

tqdm 在线程中工作(这很好,因为应用程序不会因为进度条而卡住),因此进度条显示在打印之前。

由于机器认为打印是一个 IO 动作,所以机器优先考虑 tqdm。

您需要在循环之前和之后睡觉。为此,请time.sleep(x)在循环前后使用 (x is in seconds) 来停止问题。请记住import time在代码的开头。尝试使用不同的 x 值,但只有 0.1 可能会正常工作。

于 2017-01-30T15:52:58.810 回答