Как я могу реализовать индикатор выполнения на не повторяемой строке кода? - PullRequest
0 голосов
/ 02 мая 2019

У меня есть несколько строк кода в моем скрипте Python, которые занимают от 20 минут до нескольких часов, в зависимости от размера читаемых файлов.Мне интересно, можно ли было бы реализовать индикатор выполнения, который бы отслеживал продвижение к завершению.

Из документации, которую я прочитал, я понимаю, что tqdm и progressbar2 часто используются в тех случаях, когда естьцикл for.

Вот так выглядит мой код:

gjson2 = rasterstats.zonal_stats(polygons, raster, prefix='xyz_', geojson_out=True,all_touched=False,categorical=True)

Код служит для пересечения файла полигонов (.shp) с файлом растра (.adf) для извлечения растраценности.Есть ли способ, которым я могу переписать код, чтобы сделать его итеративным?Или манипулировать tqdm или progressbar2 для работы в этом случае?

Спасибо!

1 Ответ

1 голос
/ 02 мая 2019

Мне не особо повезло, если эффективно поместить индикатор выполнения в консоль python, но если это поможет, https://geektechstuff.com/2018/12/07/creating-a-progress-bar-python/ содержит некоторую информацию о индикаторах хода выполнения окна tkinter.Пример:

from tkinter import *
from tkinter import ttk
main = Tk()

def foo(progressbar):
    progressbar.start()
    for _ in range(50):
        progressbar.step(10)
        ###Perform some Function
        progressbar.update_idletasks()
    progressbar.stop()       
progressbar = ttk.Progressbar(main, mode='indeterminate', length=696)
progressbar.grid(column=0, row=4, columnspan=100, rowspan=100, sticky=W, pady=4, padx=3)
foo(progressbar)
main.mainloop()

Код выше работает для меня (Python 3x Windows 10).

В качестве альтернативы вы можете установить progressbar на PyPI, чтобы показать панель загрузки в консоли python.Пример:

import progressbar
from time import sleep
bar = progressbar.ProgressBar(maxval=20, \
    widgets=[progressbar.Bar('=', '[', ']'), ' ', progressbar.Percentage()])
bar.start()
for i in xrange(20):
    bar.update(i+1)
    sleep(0.1)
bar.finish()

Также: символ '\ r' (возврат каретки) должен сбрасывать курсор в начало строки.Я не уверен на 100%, работает ли это на всех системах, но я знаю, что это работает на Linux и OSX:

from time import sleep
import sys

for i in range(21):
    sys.stdout.write('\r')
    # the exact output you're looking for:
    sys.stdout.write("[%-20s] %d%%" % ('='*i, 5*i))
    sys.stdout.flush()
    sleep(0.25)

Надеюсь, это поможет!

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