Форум сайта python.su
1
Добрый день!
Есть в скрипте команда, которая выполняется ощутимо долгое время.
Как сделать так, чтоб в процессе ее выполнения выводить какой-нибудь индикатор прогресса, что скрипт сейчас активно занят той строчкой?
Какие нибудь “бегающие звездочки” или “вертящаяся линия” и т.д.
Офлайн
24
Команда какого типа ? Цикл, запрос к базе, сетевая задержка ?
Офлайн
1
команда - обращение к ОС и не подразумевает итераций, поэтому о прогрессбаре речи не идет, собственно сама команда:
emerge_out = commands.getoutput("emerge system -uDNvp")
Отредактировано Chocobo (Окт. 4, 2015 21:14:21)
Офлайн
857
Надо сделать второй поток, который дожидается признака выполнения команды и выводит прогресс.
Офлайн
1
py.user.next
Спасибо! буду курить threading
Был бы благодарен за небольшой пример, как связать время выполнения команды одного потока с отображением чего либо в другом?
Тема потоков для меня пока новая)
Офлайн
857
Офлайн
1
В общем, изрыв пол инета по своему вопросу, и вашим наставлениям - нашел и подогнал под себя следующий пример, который хоть и делает примерно то, что нужно, но мне не очень нравится. По сути и есть второй поток который выводит прогресс и ждет себе сигнала завершения, но как-то не изящно совсем:
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
Отредактировано Chocobo (Окт. 5, 2015 15:46:15)
Офлайн
857
ChocoboИспользуй очередь. Не надо на глобальных переменных делать.
но как-то не изящно совсем
ChocoboВот там ссылка выше, там прямой пример того, как обмениваться данными между главным потоком и порождённым из него.
В общем, изрыв пол инета по своему вопросу, и вашим наставлениям - нашел и подогнал под себя
Офлайн
6
py.user.next
Да, глобальные переменные используют только если нет других вариантов.
Офлайн