パーサー印刷をエラーや終了ではなく、メッセージをヘルプする方法
質問
私はargparseを使用してCMD argsを処理しています。指定されたargsがない場合は、ヘルプメッセージを印刷しますが、これで解析はエラーを出力してから終了します。私のコードは次のとおりです。
def main():
print "in abing/start/main"
parser = argparse.ArgumentParser(prog="abing")#, usage="%(prog)s <command> [args] [--help]")
parser.add_argument("-v", "--verbose", action="store_true", default=False, help="show verbose output")
subparsers = parser.add_subparsers(title="commands")
bkr_subparser = subparsers.add_parser("beaker", help="beaker inspection")
bkr_subparser.set_defaults(command=beaker_command)
bkr_subparser.add_argument("-m", "--max", action="store", default=3, type=int, help="max resubmit count")
bkr_subparser.add_argument("-g", "--grain", action="store", default="J", choices=["J", "RS", "R", "T", "job", "recipeset", "recipe", "task"], type=str, help="resubmit selection granularity")
bkr_subparser.add_argument("job_ids", nargs=1, action="store", help="list of job id to be monitored")
et_subparser = subparsers.add_parser("errata", help="errata inspection")
et_subparser.set_defaults(command=errata_command)
et_subparser.add_argument("-w", "--workflows", action="store_true", help="generate workflows for the erratum")
et_subparser.add_argument("-r", "--run", action="store_true", help="generate workflows, and run for the erratum")
et_subparser.add_argument("-s", "--start-monitor", action="store_true", help="start monitor the errata system")
et_subparser.add_argument("-d", "--daemon", action="store_true", help="run monitor into daemon mode")
et_subparser.add_argument("erratum", action="store", nargs=1, metavar="ERRATUM", help="erratum id")
if len(sys.argv) == 1:
parser.print_help()
return
args = parser.parse_args()
args.command(args)
return
どうやってやるの?ありがとう。
解決
ソリューションはサブクラスで構成されています argparse.ArgumentParser
そしてそれを再定義します error()
方法。実際、エラー時に ArgumentParser
それを呼びます error()
方法。その後、カスタム引数解析は、ではなくサブクラスを通じて実行できます argparse.ArgumentParser
. 。モデル error()
機能はソースにあります argparse
:
def error(self, message):
"""error(message: string)
Prints a usage message incorporating the message to stderr and
exits.
If you override this in a subclass, it should not return -- it
should either exit or raise an exception.
"""
self.print_usage(sys.stderr)
self.exit(2, '%s: error: %s\n' % (self.prog, message))
たとえば、例外を提起することは可能です error()
, 、メッセージを印刷する代わりに、コード呼び出しが parse_args()
ユーザーパラメーターの問題を担当します。
元の答え: :コメントの明確化によると、以下は機能しません。ただし、サブコマンド関数からヘルプメッセージにアクセスするメカニズムを提供します。
あなたはほとんどそれを持っています:あなたのそれぞれで *_command(args)
関数、サイズをテストできます args
引数が十分でない場合は、エラーメッセージを印刷します。
コマンド関数で自動的に生成されたヘルプを使用する場合は、次のようにサブパーサーを各コマンドに渡すことでそれを取得できます。
args.command(subparsers, args) # Instead of args.command(args)
各 *_command()
機能は、1つではなく2つの引数を実行するだけです。自動的に生成されたヘルプは、次のようにアクセスできます。
subparsers.choices['beaker'].print_help() # or print_usage()
例えば。
代わりに、特定のサブパーサーを各サブコマンドルーチンに直接渡すことを選択できます *_command()
:
args.command(subparsers.choices[sys.argv[1]], args)
そして、それぞれで *_command(subparser, args)
, 、ヘルプを印刷します subparser.print_help()
.