ProgressBar2 在 PyCharm 中无法正常工作
ProgressBar2 not working properly in PyCharm
所以,我正在尝试在 Python 中使用这个 ProgressBar 包。我目前正在使用 PyCharm 2020.1(社区版)和 Python 3.8。目前,将进行一些计算,过程中没有打印日志的所有内容,我想要一个进度条来跟踪此过程的状态、运行时间和预计到达时间。
为此,我决定寻找一个可以为我做这件事的工具,我在 PyPi 上找到了这个 progressbar2 包,它实现了所有这些。
现在,我有一个像这样的简单代码:
bar = ProgressBar(start=0, maxval=len(data))
i = 0
for d in data[:]:
# Some computation
i += 1
bar.update(i)
bar.finish()
重要的是,我正在尝试调用三个显示类似进度条但值略有不同的函数。尽管如此,以下是我得到的结果:
[READER] Downloading 506 tickers
100% (506 of 506) |######################| Elapsed Time: 0:00:04 Time: 0:00:04
N/A% (0 of 503) | | Elapsed Time: 0:00:00 ETA: --:--:--[READER] Dumping 503 tickers to CSV
100% (503 of 503) |######################| Elapsed Time: 0:00:03 Time: 0:00:03
N/A% (0 of 503) | | Elapsed Time: 0:00:00 ETA: --:--:--[READER] Compiling 503 tickers
100% (503 of 503) |######################| Elapsed Time: 0:00:06 Time: 0:00:06
如您所见,我没有只获取完成的条并在下一个开始之前打印所需的字符串,而是获得了下一个进度条的内联表示。不知道它是否打算像那样工作,或者是我做错了什么还是 PyCharm 控制台本身存在兼容性问题。
感谢您提出的任何建议...
更新:有时它会按预期工作,而无需更改任何代码或之间的处理。如下所示:
[READER] Downloading 506 tickers
100% (506 of 506) |######################| Elapsed Time: 0:00:02 Time: 0:00:02
[READER] Dumping 502 tickers to CSV
100% (502 of 502) |######################| Elapsed Time: 0:00:01 Time: 0:00:01
[READER] Compiling 502 tickers
100% (502 of 502) |######################| Elapsed Time: 0:00:03 Time: 0:00:03
说明
progressbar
模块有 a known issue with PyCharm. The problem was with the timing between stderr
and stdout
which appeared to be fully random causing interleaved results. It has since been mitigated enough to not be an issue for most people using the progressbar
module, but it's possible that it's still present。由于 ProgressBar(start=0, maxval=len(data))
将写入 stderr
而您的 print
函数将写入 stdout
,这似乎就是问题所在。
解决方案
如果我们假设这是问题所在,您可以改用单个输出流。例如,您可以将两者都写入 stdout
:
import sys
# Write ProgressBar to stdout
bar = ProgressBar(start=0, maxval=len(data), fd=sys.stdout)
i = 0
for d in data[:]:
# Some computation
i += 1
bar.update(i)
bar.finish()
但是,如果您坚持使用两者,it's been recommended to wait ~200 milliseconds for the next output or it may break。所以,在你的情况下,是这样的:
import time
bar = ProgressBar(start=0, maxval=len(data))
i = 0
for d in data[:]:
# Some computation
i += 1
bar.update(i)
bar.finish()
# Wait 200 milliseconds
time.sleep(0.2)
# Print to stdout
所以,我正在尝试在 Python 中使用这个 ProgressBar 包。我目前正在使用 PyCharm 2020.1(社区版)和 Python 3.8。目前,将进行一些计算,过程中没有打印日志的所有内容,我想要一个进度条来跟踪此过程的状态、运行时间和预计到达时间。 为此,我决定寻找一个可以为我做这件事的工具,我在 PyPi 上找到了这个 progressbar2 包,它实现了所有这些。 现在,我有一个像这样的简单代码:
bar = ProgressBar(start=0, maxval=len(data))
i = 0
for d in data[:]:
# Some computation
i += 1
bar.update(i)
bar.finish()
重要的是,我正在尝试调用三个显示类似进度条但值略有不同的函数。尽管如此,以下是我得到的结果:
[READER] Downloading 506 tickers
100% (506 of 506) |######################| Elapsed Time: 0:00:04 Time: 0:00:04
N/A% (0 of 503) | | Elapsed Time: 0:00:00 ETA: --:--:--[READER] Dumping 503 tickers to CSV
100% (503 of 503) |######################| Elapsed Time: 0:00:03 Time: 0:00:03
N/A% (0 of 503) | | Elapsed Time: 0:00:00 ETA: --:--:--[READER] Compiling 503 tickers
100% (503 of 503) |######################| Elapsed Time: 0:00:06 Time: 0:00:06
如您所见,我没有只获取完成的条并在下一个开始之前打印所需的字符串,而是获得了下一个进度条的内联表示。不知道它是否打算像那样工作,或者是我做错了什么还是 PyCharm 控制台本身存在兼容性问题。
感谢您提出的任何建议...
更新:有时它会按预期工作,而无需更改任何代码或之间的处理。如下所示:
[READER] Downloading 506 tickers
100% (506 of 506) |######################| Elapsed Time: 0:00:02 Time: 0:00:02
[READER] Dumping 502 tickers to CSV
100% (502 of 502) |######################| Elapsed Time: 0:00:01 Time: 0:00:01
[READER] Compiling 502 tickers
100% (502 of 502) |######################| Elapsed Time: 0:00:03 Time: 0:00:03
说明
progressbar
模块有 a known issue with PyCharm. The problem was with the timing between stderr
and stdout
which appeared to be fully random causing interleaved results. It has since been mitigated enough to not be an issue for most people using the progressbar
module, but it's possible that it's still present。由于 ProgressBar(start=0, maxval=len(data))
将写入 stderr
而您的 print
函数将写入 stdout
,这似乎就是问题所在。
解决方案
如果我们假设这是问题所在,您可以改用单个输出流。例如,您可以将两者都写入 stdout
:
import sys
# Write ProgressBar to stdout
bar = ProgressBar(start=0, maxval=len(data), fd=sys.stdout)
i = 0
for d in data[:]:
# Some computation
i += 1
bar.update(i)
bar.finish()
但是,如果您坚持使用两者,it's been recommended to wait ~200 milliseconds for the next output or it may break。所以,在你的情况下,是这样的:
import time
bar = ProgressBar(start=0, maxval=len(data))
i = 0
for d in data[:]:
# Some computation
i += 1
bar.update(i)
bar.finish()
# Wait 200 milliseconds
time.sleep(0.2)
# Print to stdout