--verbose
コマンドラインから有効にし、スクリプトに次のものが含まれている場合は、デバッグ印刷ステートメントテストを追加したいと思います。
logger.info("test")
以下の質問をしましたが、答えが得られませんでした...
--verbose
コマンドラインから有効にし、スクリプトに次のものが含まれている場合は、デバッグ印刷ステートメントテストを追加したいと思います。
logger.info("test")
以下の質問をしましたが、答えが得られませんでした...
--verbose
(ユーザーにとって) と--debug
(開発者にとって)両方とも便利だと思います。logging
andを使用してそれを行う方法は次のargparse
とおりです。
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)
したがって、--debug
が設定されている場合、ログ レベルは に設定されDEBUG
ます。の場合--verbose
、ロギングは に設定されINFO
ます。どちらでもない場合、 が不足しているため--debug
、ロギング レベルがデフォルトの に設定されますWARNING
。
You need to combine the wisdom of the Argparse Tutorial with Python's Logging HOWTO. Here's an example...
> cat verbose.py
#!/usr/bin/env python
import argparse
import logging
parser = argparse.ArgumentParser(
description='A test script for http://stackoverflow.com/q/14097061/78845'
)
parser.add_argument("-v", "--verbose", help="increase output verbosity",
action="store_true")
args = parser.parse_args()
if args.verbose:
logging.basicConfig(level=logging.DEBUG)
logging.debug('Only shown in debug mode')
Run the help:
> ./verbose.py -h
usage: verbose.py [-h] [-v]
A test script for http://stackoverflow.com/q/14097061/78845
optional arguments:
-h, --help show this help message and exit
-v, --verbose increase output verbosity
Running in verbose mode:
> ./verbose.py -v
DEBUG:root:Only shown in debug mode
Running silently:
> ./verbose.py
>
境界チェックを行い、ヘルプに有効な値をリストする、より簡潔な方法を次に示します。
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))
使用法:
demo.py --log DEBUG
-v
フラグの後にレベルを整数として明示的に指定できます。
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)
編集したくない (または編集できない) スクリプトの logging.DEBUG レベルを有効にする場合は、スタートアップをカスタマイズできます。
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
次のように入力します:
import os, logging
if os.getenv('DEBUGGING'):
logging.basicConfig(level = logging.DEBUG)
次に、次のことができます。
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
http://nedbatchelder.com/blog/201001/running_code_at_python_startup.htmlの Paul Ollis から
2017-07-18: それ以来、私は別の方法に切り替えました:
logging.basicConfig(level=logging.DEBUG if __debug__ else logging.INFO)
これが何をするかというと、( のように) 最適化なしで実行python script.py
している場合は DEBUG レベルのものを取得しますが、最適化して実行するとpython -OO script.py
そうではありません。設定する環境変数はありません。
これは、デフォルトの警告から情報 (-v)、デバッグ (-vv) の 2 レベルまで冗長性を高めるために、argparse に -v オプションをカウントさせる別の方法です。これは、によって定義された定数にマップされませんlogging
が、値を直接計算して、入力を制限します。
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