Недавно я научился 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.
Я также хотел реализовать такой сценарий cli, используя argparse
, однако я обнаружил, что это намного сложнее, чем я думал.
Как
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
, но как реализовать new <name>
с использованием argparse? Я попытался использовать 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? Заранее спасибо.