Ich benutze tqdm
in Python Console-Fortschrittsbalken in unseren Skripts anzuzeigen. Allerdings muss ich Funktionen aufrufen, die print
Nachrichten an die Konsole auch und die ich nicht ändern kann. Im Allgemeinen an die Konsole zu schreiben, während in den Konsolenfortschrittsbalken anzeigt verunstaltet das Display wie so up:Redirect Druckbefehl in Python-Skript durch tqdm.write()
0%| | 0/3 [00:00<?, ?it/s]Foo
blabla
33%|###########6 | 1/3 [00:00<00:01, 2.00it/s]Foo
blabla
67%|#######################3 | 2/3 [00:01<00:00, 2.00it/s]Foo
blabla
100%|###################################| 3/3 [00:01<00:00, 2.00it/s]
According to the documentation of tqdm
Verfahren tqdm.write()
stellen ein Mittel zu schreiben:
from time import sleep
from tqdm import tqdm
def blabla():
print "Foo blabla"
for k in tqdm(range(3)):
blabla()
sleep(.5)
Diese den Ausgang schafft Nachrichten an die Konsole, ohne die angezeigten Fortschrittsbalken zu unterbrechen. Somit wird der rechte Ausgang dieses Schnipsel zur Verfügung gestellt:
from time import sleep
from tqdm import tqdm
def blabla():
tqdm.write("Foo blabla")
for k in tqdm(range(3)):
blabla()
sleep(.5)
Und das sieht so aus:
Foo blabla
Foo blabla
Foo blabla
100%|###################################| 3/3 [00:01<00:00, 1.99it/s]
Auf der anderen Seite gibt es diese solution which permits to silence those functions durch ganz elegant sys.stdout
ins Leere umgeleitet wird. Dies funktioniert perfekt zum Stummschalten der Funktionen.
Da ich will, ohne zu brechen, die Fortschrittsbalken dennoch die Nachrichten von diesen Funktionen anzuzeigen, habe ich versucht, die beiden Lösungen in eine verschmelzen durch sys.stdout
zu tqdm.write()
und wiederum ließ tqdm.write()
Schreiben in die altensys.stdout
umleitet. Daraus ergibt sich die Schnipsel:
from time import sleep
import contextlib
import sys
from tqdm import tqdm
class DummyFile(object):
file = None
def __init__(self, file):
self.file = file
def write(self, x):
tqdm.write(x, file=self.file)
@contextlib.contextmanager
def nostdout():
save_stdout = sys.stdout
sys.stdout = DummyFile(save_stdout)
yield
sys.stdout = save_stdout
def blabla():
print "Foo blabla"
for k in tqdm(range(3)):
with nostdout():
blabla()
sleep(.5)
Dies ist jedoch tatsächlich schafft eine noch verkorkste Ausgang nach wie vor:
0%| | 0/3 [00:00<?, ?it/s]Foo
blabla
33%|###########6 | 1/3 [00:00<00:01, 2.00it/s]Foo
blabla
67%|#######################3 | 2/3 [00:01<00:00, 2.00it/s]Foo
blabla
100%|###################################| 3/3 [00:01<00:00, 2.00it/s]
FYI: Aufruf tqdm.write(..., end="")
innerhalb DummyFile.write()
erzeugt das gleiche Ergebnis wie die erste Ausgabe, die ist immer noch vermasselt.
Ich kann nicht verstehen, warum das nicht funktionieren würde, da tqdm.write()
verwaltet werden soll, den Fortschrittsbalken vor dem Schreiben der Nachricht zu löschen und dann den Fortschrittsbalken neu schreiben.
Was fehlt mir?
Wenn 'blabla()' raise ein Fehler, der Standard-Standard wird nie wiederhergestellt werden. – Conchylicultor