Używam tqdm
do drukowania postępu w skrypcie, który uruchamiam w notatniku Jupyter. Drukuję wszystkie wiadomości do konsoli za pośrednictwem tqdm.write()
. Jednak nadal daje mi to wypaczony wynik:
Oznacza to, że za każdym razem, gdy ma być wydrukowany nowy wiersz, nowy pasek postępu jest drukowany w następnym wierszu. Nie dzieje się tak, gdy uruchamiam skrypt przez terminal. Jak mogę to rozwiązać?
python
jupyter-notebook
tqdm
Rohan Saxena
źródło
źródło
tqdm_notebook
, mogę nawet normalnie robićprint
i nie ma to wpływu na pasek postępu.progressbar
stackoverflow.com/questions/3160699/python-progress-bar/ ...Odpowiedzi:
Spróbuj użyć
tqdm.notebook.tqdm
zamiasttqdm
, jak opisano tutaj .Może to być tak proste, jak zmiana importu na:
from tqdm.notebook import tqdm
Powodzenia!
EDYCJA: Po testach wydaje się, że
tqdm
faktycznie działa dobrze w „trybie tekstowym” w notatniku Jupyter. Trudno to stwierdzić, ponieważ nie podano minimalnego przykładu , ale wygląda na to, że problem jest spowodowany instrukcją print w każdej iteracji. Instrukcja print umieszcza liczbę (~ 0,89) pomiędzy każdą aktualizacją paska stanu, co psuje wynik. Spróbuj usunąć instrukcję print.źródło
print()
oświadczenia, użyłemtqdm.write()
. Jednaktqdm_notebook
daje dobre efekty. Dziękitqdm
, a nietqdm_notebook
? Działa to dobrze z Pythonem 3.6 i Jupyter 1.0.0.To jest alternatywna odpowiedź w przypadku, gdy tqdm_notebook nie działa dla Ciebie.
Biorąc pod uwagę następujący przykład:
Wynik będzie wyglądał mniej więcej tak (postęp byłby czerwony):
Problem polega na tym, że dane wyjściowe do stdout i stderr są przetwarzane asynchronicznie i osobno pod względem nowych wierszy.
Jeśli powiedzmy, że Jupyter odbiera na stderr pierwszą linię, a następnie „przetworzone” wyjście na standardowe wyjście. Następnie, gdy otrzyma wyjście na stderr, aby zaktualizować postęp, nie wróci i nie zaktualizuje pierwszej linii, ponieważ zaktualizuje tylko ostatnią linię. Zamiast tego będzie musiał napisać nową linię.
Obejście 1, zapisywanie na standardowe wyjście
Jednym obejściem byłoby wyprowadzenie obu na standardowe wyjście:
Wynik zmieni się na (nie będzie już czerwony):
Tutaj widzimy, że Jupyter nie wydaje się oczyścić do końca linii. Moglibyśmy dodać inne obejście tego problemu, dodając spacje. Jak na przykład:
Co daje nam:
Obejście 2, zamiast tego ustaw opis
Ogólnie rzecz biorąc, prostsze może być nie posiadanie dwóch wyjść, ale zamiast tego zaktualizowanie opisu, np .:
Z wyjściem (opis aktualizowany podczas przetwarzania):
Wniosek
W większości przypadków można go sprawić, aby działał dobrze za pomocą zwykłego tqdm. Ale jeśli tqdm_notebook działa dla ciebie, po prostu go użyj (ale wtedy prawdopodobnie nie przeczytałeś aż tak daleko).
źródło
progressbar
stackoverflow.com/a/34482761/1207193Większość odpowiedzi jest teraz nieaktualna. Lepiej, jeśli poprawnie zaimportujesz tqdm .
źródło
TqdmDeprecationWarning: This function will be removed in tqdm==5.0.0 Please use tqdm.notebook.tqdm instead of tqdm.tqdm_notebook
Jeśli inne wskazówki nie działają i - tak jak ja - korzystasz z
pandas
integracjiprogress_apply
, możesztqdm
sobie z tym poradzić:Główny punkt leży w
tqdm.autonotebook
module. Jak stwierdzono w ich instrukcjach dotyczących używania w notatnikach IPython , powoduje totqdm
wybór między formatami paska postępu używanymi w notebookach Jupyter i konsolach Jupyter - z powodu, dla którego wciąż brakuje dalszych badań z mojej strony, określony format wybrany przeztqdm.autonotebook
działa płynniepandas
, podczas gdy wszystkie inne nie. „t, oprogress_apply
specjalnie.źródło
Aby zakończyć odpowiedź oscarbranson: możliwe jest automatyczne wybranie wersji paska postępu na konsole lub notebooka w zależności od tego, skąd jest uruchamiany:
Więcej informacji można znaleźć tutaj
źródło
Żadne z powyższych nie działa dla mnie. Uważam, że uruchomienie do następujących rozwiązuje ten problem po błędzie (po prostu usuwa wszystkie wystąpienia pasków postępu w tle):
źródło
try: # Avoids problem on notebooks / Hydrogen IDE tqdm.tqdm._instances.clear() except Exception: pass
Użyj tqdm_notebook
z tqdm import tqdm_notebook jako tqdm
x = [1, 2, 3, 4, 5]
for i in tqdm (len (x)):
źródło
Dla każdego, kto korzysta z systemu Windows i nie mógł rozwiązać problemu z powielaniem pasków za pomocą żadnego z wymienionych tutaj rozwiązań. Musiałem zainstalować
colorama
pakiet zgodnie ze znanymi problemami tqdm, które go naprawiły.Wypróbuj na tym przykładzie:
Który da coś takiego:
źródło