最近我学会了optdoc
来编写cli脚本,有一个示例可以很容易地使用optdoc
来实现:
Usage:
naval_fate.py ship new <name>...
naval_fate.py ship <name> move <x> <y> [--speed=<kn>]
naval_fate.py ship shoot <x> <y>
naval_fate.py mine (set|remove) <x> <y> [--moored|--drifting]
naval_fate.py -h | --help
naval_fate.py --version
Options:
-h --help Show this screen.
--version Show version.
--speed=<kn> Speed in knots [default: 10].
--moored Moored (anchored) mine.
--drifting Drifting mine.
我还想使用argparse
实现这样的cli脚本,但是,我发现这比我想象的要困难得多。
像
naval_fate.py ship new <name>...
naval_fate.py mine (set|remove) <x> <y> [--moored|--drifting]
我将ship
和mine
分为两组,我的代码是:
parser = argparse.ArgumentParser(description="Naval Fate.")
sub_parse = parser.add_subparsers()
# ship command
ship_parser = sub_parse.add_parser("ship", help="ship command info.")
# mine command
mine_parser = sub_parse.add_parser("mine", help="mine command info.")
对于shine new <name>
,我将new <name>
作为组ship
的子命令,但是如何使用argparse实现new <name>
?我尝试使用ship_parser.add_argument("new", action="store", help="give a new name to the ship")
,而new
会被解析为位置参数,但不能有值:
✘ ⚙ args_parse python3 naval_args.py ship new "new_name"
usage: naval_args.py [-h] {ship,mine} ...
naval_args.py: error: unrecognized arguments: new_name
系统令牌new_name
作为新的位置参数,而不是new
的值。
我也对naval_fate.py mine (set|remove) <x> <y> [--moored|--drifting]
的实现方式有疑问。
那么我如何使用argparse实现脚本?预先感谢。