Aby zaimplementować pasek stanu, jak poniżej:
[========== ] 45%
[================ ] 60%
[==========================] 100%
Chcę, aby to zostało wydrukowane na standardowe wyjście i ciągle je odświeżać, a nie drukować do innej linii. Jak to zrobić?
Odpowiedzi:
Istnieje moduł Pythona, który można pobrać z PyPI o nazwie,
progressbar
który implementuje taką funkcjonalność. Jeśli nie masz nic przeciwko dodaniu zależności, to jest dobre rozwiązanie. W przeciwnym razie przejdź do jednej z pozostałych odpowiedzi.Prosty przykład, jak go używać:
Aby go zainstalować, możesz użyć
easy_install progressbar
lub,pip install progressbar
jeśli wolisz, pip.źródło
bar.start()
?bar.start()
sudo -H pip install progressbar2
.'\r'
Charakter (powrót karetki) resetuje kursor na początku linii i pozwala zapisać ponad to, co było wcześniej na linii.Nie jestem w 100% pewien, czy jest to całkowicie przenośne we wszystkich systemach, ale działa przynajmniej na Linuksie i OSX.
źródło
n=21
, wymienićrange(21)
sięrange(n)
, a następnie dodaćj = (i + 1) / n
wewnątrz pętli i zastąpićwrite
oświadczenie z tej niewielkiej modyfikacji:sys.stdout.write("[%-20s] %d%%" % ('='*int(20*j), 100*j))
. Teraz jedyną zmianą, jaką musisz wprowadzić, jest umieszczenie gon=21
przed pętlą (bardziej prawdopodobnen=len(iterable)
), a następnie wyliczenie na iterowalnym obiekcie. Poleciłem tę zmianę, ale została odrzucona; pozornie funkcjonalność „odbiega od pierwotnej intencji postu”.sys.stdout.write("[{:{}}] {:.1f}%".format("="*i, n-1, (100/(n-1)*i)))
Znalazłem przydatną bibliotekę tqdm ( https://github.com/tqdm/tqdm/ , wcześniej: https://github.com/noamraph/tqdm ). Automatycznie szacuje czas ukończenia i może być używany jako iterator.
Stosowanie:
Prowadzi do:
tqdm
może zawijać dowolne iterowalne.źródło
Możesz użyć
\r
( powrót karetki ). Próbny:źródło
total
jako10
, a otrzymasz komunikat o błędzieZeroDivisionError: long division or modulo by zero
Tutaj możesz użyć następującego kodu jako funkcji:
Przy użyciu .format:
źródło
] percent * 100 %
Bazując na powyższych odpowiedziach i innych podobnych pytaniach dotyczących paska postępu CLI, myślę, że uzyskałem ogólną wspólną odpowiedź na wszystkie z nich. Sprawdź to na https://stackoverflow.com/a/15860757/2254146
Oto kopia funkcji, ale zmodyfikowana w celu dopasowania do Twojego stylu:
Wygląda jak
Procent: [====================] 99,0%
źródło
Jeśli tworzysz interfejs wiersza poleceń, proponuję przyjrzeć się,
click
który jest bardzo przyjemny:Tutaj otrzymujesz wynik:
źródło
Dalsze ulepszanie, używając funkcji jak:
przykład dzwonienia:
wynik:
źródło
Natknąłem się na ten wątek dzisiaj i po wypróbowaniu tego rozwiązania od Marka Rushakoffa
Mogę powiedzieć, że działa to dobrze na W7-64 z 64-bitowym Pythonem 3.4.3, ale tylko w natywnej konsoli. Jednak podczas korzystania z wbudowanej konsoli spyder 3.0.0dev podziały wierszy są nadal / ponownie obecne. Ponieważ zrozumienie tego zajęło mi trochę czasu, chciałbym zgłosić tę obserwację tutaj.
źródło
Opierając się na niektórych odpowiedziach tutaj i gdzie indziej, napisałem tę prostą funkcję, która wyświetla pasek postępu i upływający / szacowany pozostały czas. Powinien działać na większości maszyn z systemem UNIX.
źródło
Jest to dość proste podejście, które można zastosować w przypadku dowolnej pętli.
źródło
Najłatwiej jest nadal
Kluczem jest konwersja typu liczby całkowitej na łańcuch.
źródło
Jak opisano w rozwiązaniu Marka Rushakoffa , można wyprowadzić znak powrotu karetki
sys.stdout.write('\r')
, aby zresetować kursor do początku wiersza. Aby uogólnić to rozwiązanie, jednocześnie implementując f-Strings w Pythonie 3 , możesz użyćźródło
Wypróbuj PyProg. PyProg to biblioteka open source dla Pythona do tworzenia super konfigurowalnych wskaźników postępu i pasków.
Obecnie jest w wersji 1.0.2; jest hostowany na Github i dostępny na PyPI (linki poniżej). Jest kompatybilny z Pythonem 3 i 2 i może być również używany z Qt Console.
Jest naprawdę łatwy w użyciu. Poniższy kod:
wyprodukuje dokładnie to, czego chcesz (nawet długość paska!):
Aby uzyskać więcej opcji dostosowywania paska postępu, przejdź do strony Github w tej witrynie.
Zrobiłem PyProg, ponieważ potrzebowałem prostej, ale super konfigurowalnej biblioteki paska postępu. Można łatwo zainstalować go z:
pip install pyprog
.PyProg Github: https://github.com/Bill13579/pyprog
PyPI: https://pypi.python.org/pypi/pyprog/
źródło
Używając odpowiedzi @ Mark-Rushakoff, wypracowałem prostsze podejście, bez konieczności dzwonienia do biblioteki sys. Działa z Pythonem 3. Przetestowano w systemie Windows:
źródło
print
jest cienka otoka, która formatuje dane wejściowe i wywołuje funkcję zapisu danego obiektu. Domyślnie tym obiektem jestsys.stdout
.Oto coś, co zrobiłem za pomocą rozwiązania autorstwa @ Mark-Rushakoff. Adaptacyjne dopasowanie do szerokości terminala.
źródło