Wenn Sie die Konsolen-App in Python verwenden, können Sie mit Klicken auf Fortschrittsleiste den Fortschritt bei längerer Arbeit visualisieren.
In einigen Fällen möchten Sie jedoch möglicherweise die Ausgabe des Fortschrittsbalkens mit einem optionalen Argument aktivieren / deaktivieren, wenn Sie eine Verarbeitungsfunktion, die ursprünglich den Fortschrittsbalken verwendet hat, in den Serverprozess oder die Stapelverarbeitung einfügen.
Hier sind einige Codemuster, die in solchen Fällen verwendet werden können. => Ich habe eine Technik gefunden, um / dev / null für file
anzugeben, also ist das die erste ...
import sys
import click
def something(items, show_progress=False):
out = sys.stdout if show_progress else open('/dev/null', 'wb')
with click.progressbar(items, file=out) as bar:
for item in bar:
'abcd' * (1024 * 10)
items = list(xrange(10000))
something(items, show_progress=True)
print '--------'
something(items, show_progress=False)
Es scheint, dass Sie das Ausgabeziel von "click.progressbar" mit der Option "file" angeben können. Wenn Sie also ein Dateiobjekt angeben, das in "/ dev / null" geschrieben werden soll, wird nichts ausgegeben. Wenn Sie jedoch eine Funktion wie diese tausende Male aufrufen, sollten Sie das ordnungsgemäß geöffnete Dateiobjekt schließen.
import functools
from contextlib import contextmanager
import click
@contextmanager
def dummy_bar(items, **kwargs):
yield items
def something(items, show_progress=False):
f = click.progressbar if show_progress else dummy_bar
fbar = functools.partial(f, items, show_pos=True, show_eta=True)
with fbar() as bar:
for item in bar:
'abcd' * (1024 * 10)
items = list(xrange(10000))
something(items, show_progress=True)
print '--------'
something(items, show_progress=False)
Ich habe eine Funktion namens "dummy_bar" definiert, um eine Leiste zu erstellen, die nichts ausgibt. Da "click.progressbar" mit der "with" -Klausel aufgerufen wird, wird es der Variablen nach "as" unter Verwendung des Kontextmanagers zugewiesen, dh die durch das Argument angegebene Iterierbarkeit wird zurückgegeben, wie es mit "ield "ist. ..
Die zu verwendende Funktion wird mit der Option "show_progress" umgeschaltet, und die Argumente werden teilweise in "functools.partial" angewendet, so dass sie ohne Argumente einheitlich aufgerufen werden können. Also, wo es ursprünglich "mit click.progressbar (..." war, ist es einfach "mit fbar ()".
Jetzt wird die "Leiste" entsprechend dem Verhalten der Option durch "als" zugewiesen, und der Rest ist in Ordnung, wenn Sie sie normalerweise wie "click.progressbar" verwenden.
Recommended Posts