Помогите с Python в то время как поведение цикла - PullRequest
1 голос
/ 21 августа 2009

У меня есть скрипт, который использует простой цикл while для отображения индикатора выполнения, но, похоже, он работает не так, как я ожидал:

count = 1
maxrecords = len(international)
p = ProgressBar("Blue")
t = time
while count < maxrecords:
    print 'Processing %d of %d' % (count, maxrecords)
    percent = float(count) / float(maxrecords) * 100
    p.render(int(percent))
    t.sleep(0.5)
    count += 1

Кажется, что он зацикливается на "p.render ..." и не возвращается к "print" Обработка% d из% d ... '".

ОБНОВЛЕНИЕ: Мои извинения. Похоже, что ProgressBar.render () удаляет вывод «print 'Processing ...» при отображении индикатора выполнения. Индикатор выполнения от http://nadiana.com/animated-terminal-progress-bar-in-python

Ответы [ 4 ]

5 голосов
/ 21 августа 2009

Я вижу, что вы используете реализацию ProgressBar на моем сайте. Если вы хотите напечатать сообщение, вы можете использовать аргумент message в render

p.render(percent, message='Processing %d of %d' % (count, maxrecords))
3 голосов
/ 21 августа 2009

Это не способ написать цикл в Python.

maxrecords = len(international)
p = ProgressBar("Blue")
for count in range(1, maxrecords):
    print 'Processing %d of %d' % (count, maxrecords)
    percent = float(count) / float(maxrecords) * 100
    p.render(int(percent))
    time.sleep(0.5)

Если вы действительно хотите что-то сделать с записью, а не просто визуализировать панель, вы должны сделать это:

maxrecords = len(international)
for count, record in enumerate(international):
    print 'Processing %d of %d' % (count, maxrecords)
    percent = float(count) / float(maxrecords) * 100
    p.render(int(percent))
    process_record(record)   # or whatever the function is
2 голосов
/ 21 августа 2009

Что такое реализация для ProgressBar.render()? Я предполагаю, что он выводит управляющие символы терминала, которые перемещают курсор так, что предыдущий вывод перезаписывается. Это может создать ложное впечатление, что поток управления не работает должным образом.

1 голос
/ 21 августа 2009

(1) [не является частью проблемы, но ...] t = time, за которым гораздо позже t.sleep(0.5) будет источником раздражения для любого, кто увидит голое t и будет вынужден читать в обратном направлении, чтобы найти то, что это так.

(2) [не является частью проблемы, но ...] count никогда не может войти в цикл с тем же значением, что и maxrecords. Например. если maxrecords равно 10, код в цикле выполняется только 9 раз.

(3) В показанном вами коде нет ничего, что поддерживало бы идею о том, что оно «зацикливается на p.render ()» - если только сам метод render не зацикливается, если его аргумент равен нулю, что случай, если maxrecords равно 17909. Попробуйте временно заменить p.render (....) на (скажем)

print "pretend-render: pct =", int(percent)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...