Ich möchte einen Debug-Druckanweisungstest hinzufügen, wenn ich ihn --verbose
über die Befehlszeile aktiviere und im Skript Folgendes habe.
logger.info("test")
Ich habe die folgenden Fragen durchgearbeitet, konnte aber keine Antwort bekommen ...
python
python-2.7
user1934146
quelle
quelle
Ich finde sowohl
--verbose
(für Benutzer) als auch--debug
(für Entwickler) nützlich. So mache ich das mitlogging
undargparse
:import argparse import logging parser = argparse.ArgumentParser() parser.add_argument( '-d', '--debug', help="Print lots of debugging statements", action="store_const", dest="loglevel", const=logging.DEBUG, default=logging.WARNING, ) parser.add_argument( '-v', '--verbose', help="Be verbose", action="store_const", dest="loglevel", const=logging.INFO, ) args = parser.parse_args() logging.basicConfig(level=args.loglevel)
Wenn
--debug
also festgelegt ist, wird die Protokollierungsstufe auf festgelegtDEBUG
. Wenn--verbose
, ist die Protokollierung auf eingestelltINFO
. Wenn dies nicht der Fall ist, setzt das Fehlen von--debug
die Protokollierungsstufe auf den Standardwert vonWARNING
.quelle
if
s oder irgendetwas nach parse_argslogging
Standardmäßig druckt alles auf stderr und Sie wirklich wollen , um Ihre normalen Programmausgabe (die von Trennung--verbose
) von dev-only (dem aus--debug
)logging.basicConfig
senden ?info()
debug()
Hier ist eine präzisere Methode, die die Grenzen überprüft und gültige Werte in der Hilfe auflistet:
parser = argparse.ArgumentParser(description='This is a demo.') parser.add_argument("-l", "--log", dest="logLevel", choices=['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'], help="Set the logging level") args = parser.parse_args() if args.logLevel: logging.basicConfig(level=getattr(logging, args.logLevel))
Verwendung:
quelle
getattr
:level=logging.getLevelName(args.logLevel)
default='INFO'
zuadd_argument()
sowie(default: %(default)s)
auf den Hilfetext, dann ist die löschenif args.logLevel
und rufen immerbasicConfig()
. Dann kann der Benutzer wissen, wie der Standardwert immer sein wird.Eine andere Variante wäre, die Anzahl zu zählen
-v
und die Anzahl als Index für das alist
mit den tatsächlichen Ebenen von zu verwendenlogging
:import argparse import logging parser = argparse.ArgumentParser() parser.add_argument('-v', '--verbose', action='count', default=0) args = parser.parse_args() levels = [logging.WARNING, logging.INFO, logging.DEBUG] level = levels[min(len(levels)-1,args.verbose)] # capped to number of levels logging.basicConfig(level=level, format="%(asctime)s %(levelname)s %(message)s") logging.debug("a debug message") logging.info("a info message") logging.warning("a warning message")
Dies funktioniert für
-vvvv
,-vvv
,-vv
,-v
,-v -v
, usw., wenn nicht-v
dannlogging.WARNING
gewählt, wenn mehr-v
vorgesehen sind es zu betreten wirdINFO
undDEBUG
quelle
python script.py -v [other_args]
. Wenn Siepython -v script.py
(-v
vor dem Skript) ausführen , erhalten Sie viele Debug-Ausgaben vom Python-Interpreter selbst, jedoch nicht von Ihrem Skript. (Kein Problem mit der Antwort, nur eine Warnung an andere Leser).Sie können eine Ebene explizit als Ganzzahl nach dem
-v
Flag angeben :parser = argparse.ArgumentParser() parser.add_argument("-v", "--verbose", const=1, default=0, type=int, nargs="?", help="increase verbosity: 0 = only warnings, 1 = info, 2 = debug. No number means info. Default is no verbosity.") args = parser.parse_args() logger = logging.getLogger() if args.verbose == 0: logger.setLevel(logging.WARN) elif args.verbose == 1: logger.setLevel(logging.INFO) elif args.verbose == 2: logger.setLevel(logging.DEBUG)
quelle
Hier ist eine weitere Möglichkeit, wie Argparse die Option -v zählt, um die Ausführlichkeit von der Standardwarnung WARNING über INFO (-v) bis DEBUG (-vv) um zwei Stufen zu erhöhen. Dies wird nicht den durch definierten Konstanten zugeordnet,
logging
sondern berechnet den Wert direkt und begrenzt die Eingabe:print( "Verbosity / loglevel:", args.v ) logging.basicConfig( level=10*(3-max(0,min(args.v,3))) ) logging.debug("debug") # 10 logging.info("info") # 20 logging.warning("warning") # 30 - The default level is WARNING, which means that only events of this level and above will be tracked logging.error("error") # 40 logging.critical("critical") # 50
quelle
default=0
, sonst erhalten SieTypeError: '<' not supported between instances of 'int' and 'NoneType'
. Oder fügen Sieargs.v or 0
oben hinzu ...Wenn Sie die Protokollierungsstufe DEBUG für ein Skript aktivieren möchten, das Sie nicht bearbeiten möchten (oder können), können Sie Ihren Start anpassen:
jcomeau@aspire:~$ python -c "import site; site._script()" [snip]... USER_BASE: '/home/jcomeau/.local' (exists) USER_SITE: '/home/jcomeau/.local/lib/python2.7/site-packages' (exists) ENABLE_USER_SITE: True jcomeau@aspire:~$ mkdir -p ~/.local/lib/python2.7/site-packages jcomeau@aspire:~$ vi ~/.local/lib/python2.7/site-packages/usercustomize.py
gib das Folgende ein:
import os, logging if os.getenv('DEBUGGING'): logging.basicConfig(level = logging.DEBUG)
dann kannst du einfach:
jcomeau@aspire:~$ mkdir -p /tmp/some/random/ jcomeau@aspire:~$ echo 'import logging; logging.debug("test")' >> /tmp/some/random/script.py jcomeau@aspire:~$ DEBUGGING=1 python /tmp/some/random/script.py DEBUG:root:test
von Paul Ollis unter http://nedbatchelder.com/blog/201001/running_code_at_python_startup.html
2017-07-18: Ich habe seitdem zu einer anderen Methode gewechselt:
logging.basicConfig(level=logging.DEBUG if __debug__ else logging.INFO)
Wenn Sie ohne Optimierung (wie in
python script.py
) arbeiten, erhalten Sie das Zeug auf DEBUG-Ebene, währendpython -OO script.py
Sie es nicht tun , wenn Sie mit laufen . Keine Umgebungsvariablen zu setzen.quelle