ProgressBar2 не работает должным образом в PyCharm - PullRequest
1 голос
/ 29 апреля 2020

Итак, я пытаюсь использовать этот пакет ProgressBar в Python. В настоящее время я использую PyCharm 2020.1 (Community Edition) с Python 3.8. В настоящее время будут выполняться некоторые вычисления, все без журналов отпечатков в процессе, и я хочу, чтобы индикатор выполнения отслеживал как состояние, так и истекшее время и ETA для этого процесса. Для этого я решил поискать инструмент, который бы сделал это для меня, и я нашел этот пакет progressbar2 в PyPi, который реализует все это. На данный момент у меня есть простой код, подобный этому:

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

1 Ответ

0 голосов
/ 05 мая 2020

Пояснение

Модуль progressbar имел известную проблему с PyCharm . Проблема заключалась в том, что время между stderr и stdout оказалось совершенно случайным, что чередовало результаты. С тех пор он был достаточно смягчен, чтобы не быть проблемой для большинства людей, использующих модуль progressbar, но возможно, что он все еще присутствует . Поскольку 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()

Однако, если вы настаиваете на использовании обоих, рекомендуется подождать ~ 200 миллисекунд для следующего вывода, иначе он может сломаться . Итак, в вашем случае, что-то вроде:

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
...