如何使用argsparse实现这样的cli脚本?

时间:2019-03-29 06:35:44

标签: python-3.x argparse

最近我学会了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]

我将shipmine分为两组,我的代码是:

    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实现脚本?预先感谢。

0 个答案:

没有答案