Найти - Пользователи
Полная версия: индикатор процесса выполнения
Начало » Python для новичков » индикатор процесса выполнения
1
Chocobo
Добрый день!

Есть в скрипте команда, которая выполняется ощутимо долгое время.
Как сделать так, чтоб в процессе ее выполнения выводить какой-нибудь индикатор прогресса, что скрипт сейчас активно занят той строчкой?

Какие нибудь “бегающие звездочки” или “вертящаяся линия” и т.д.
ayb
Команда какого типа ? Цикл, запрос к базе, сетевая задержка ?
Chocobo
команда - обращение к ОС и не подразумевает итераций, поэтому о прогрессбаре речи не идет, собственно сама команда:

emerge_out = commands.getoutput("emerge system -uDNvp")
py.user.next
Надо сделать второй поток, который дожидается признака выполнения команды и выводит прогресс.
Chocobo
py.user.next
Спасибо! буду курить threading
Был бы благодарен за небольшой пример, как связать время выполнения команды одного потока с отображением чего либо в другом?
Тема потоков для меня пока новая)
py.user.next
python.org. пример обмена данными
Chocobo
В общем, изрыв пол инета по своему вопросу, и вашим наставлениям - нашел и подогнал под себя следующий пример, который хоть и делает примерно то, что нужно, но мне не очень нравится. По сути и есть второй поток который выводит прогресс и ждет себе сигнала завершения, но как-то не изящно совсем:

import sys
import time
import threading
class progress_bar_loading(threading.Thread):
    def run(self):
            start = time.time()
            global stop
            global kill
            print('Loading....  '),
            sys.stdout.flush()
            i = 0
            while stop != True:
                    sys.stdout.write("\r "+'Loading: '+'\b*'*(i%4)+'\t\t\t\t\t{0}'.ljust(0).format(time.time() - start))
                    sys.stdout.flush()
                    time.sleep(0.5)
                    i+=1
            print '\b\b Done!'
kill = False
stop = False
try:
    #anything you want to run.
    p = progress_bar_loading()
    p.start()
    time.sleep(8)
    stop = True
    time.sleep(1)
    print 
    p2 = progress_bar_loading()
    stop = False
    p2.start()
    time.sleep(5)
    stop = True
except KeyboardInterrupt or EOFError:
         stop = True
py.user.next
Chocobo
но как-то не изящно совсем
Используй очередь. Не надо на глобальных переменных делать.

Chocobo
В общем, изрыв пол инета по своему вопросу, и вашим наставлениям - нашел и подогнал под себя
Вот там ссылка выше, там прямой пример того, как обмениваться данными между главным потоком и порождённым из него.
sypper-pit
py.user.next
Да, глобальные переменные используют только если нет других вариантов.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB