【问题标题】:ProgressBar2 not working properly in PyCharmProgressBar2 在 PyCharm 中无法正常工作
【发布时间】:2020-04-29 18:40:22
【问题描述】:

所以,我正在尝试在 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

【问题讨论】:

    标签: python pycharm python-3.8


    【解决方案1】:

    说明

    progressbar 模块有a known issue with PyCharm。问题在于stderrstdout 之间的时间,这似乎是完全随机的,导致交错的结果。 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
    

    【讨论】:

    • 感谢您提供的解决方案,我已经尝试了第一个解决方案,目前运行良好。至于时间延迟的第二个,因为我正在开发一个最终将在实时系统上运行的程序,这一点很重要,因此不会再添加任何可能拖欠执行的东西。
    猜你喜欢
    • 2016-01-15
    • 2022-07-20
    • 2023-03-25
    • 2016-12-01
    • 2019-11-04
    • 2016-09-11
    • 1970-01-01
    • 2020-04-17
    • 1970-01-01
    相关资源
    最近更新 更多