前提・実現したいこと
argparse(subparser)を入れ子にして、引数解析を行っております。
1.(スクリプト名) add で実行
2.(スクリプト名) add bar -aaa(誤ったオプション) で実行
1.2ともにトップレベルパーサーのusageが出力されます。
1は、addレベル
2は、barレベルのパーサのusageが出力されるようにしたいです。
2の期待する出力:usage: hoge.py add bar [-h] [--fuga FUGA]
2の実際の出力 :usage: hoge.py [-h] {add,del} ...
試行錯誤してみましたが、うまくいきません。
何か良い方法はないでしょうか?コメントよろしくお願いします。
発生している問題・エラーメッセージ
該当のソースコード
import argparse import sys def command_add(args): print('execute add') def command_add_foo(args): print('execute foo') def command_add_bar(args): print('execute bar') def command_del(args): print('execute del') parser = argparse.ArgumentParser() subparsers = parser.add_subparsers() # サブコマンドadd parser_add = subparsers.add_parser('add', help='see `add -h`') subparser_add = parser_add.add_subparsers() # サブコマンドaddのサブコマンドfoo parser_foo = subparser_add.add_parser('foo', help='see `add foo -h`') parser_foo.add_argument('hoge', help='hoge') parser_foo.set_defaults(func=command_add_foo) # サブコマンドaddのサブコマンドbar parser_bar = subparser_add.add_parser('bar', help='see `add bar -h`') parser_bar.add_argument('--fuga', help='fuga') parser_bar.set_defaults(func=command_add_bar) # サブコマンドdel parser_commit = subparsers.add_parser('del', help='see `del -h`') parser_commit.add_argument('-s') parser_commit.set_defaults(func=command_del) args = parser.parse_args() if not hasattr(args, 'func'): parser.print_usage() sys.exit() args.func(args)
試したこと
1については以下のコードでサブパーサーのヘルプを出力する事は出来ましたが、
2についてはparser.parse_args()の解析中に上位パーサーでエラーとなってしまうのですが、その前で判断する方法が思いつきません。
args = parser.parse_args() if not hasattr(args, 'func'): if len(sys.argv) == 2 and sys.argv [1] == 'add': parser_bar.print_usage() sys.exit() parser.print_usage() sys.exit()
補足情報(FW/ツールのバージョンなど)
あなたの回答
tips
プレビュー