argparse和optparse的子命令替代

ana*_*nik 7 python optparse argparse

对于子命令,argparse/optparse是否有任何直观的替代方法?他们都很糟糕 - 这是疯狂的配置或疯狂的输出.

真实世界的例子(被盗,不想要):

>>> parser = argparse.ArgumentParser()
>>> subparsers = parser.add_subparsers(title='subcommands',
...                                    description='valid subcommands',
...                                    help='additional help')
>>> subparsers.add_parser('foo')
>>> subparsers.add_parser('bar')
>>> parser.parse_args(['-h'])
usage:  [-h] {foo,bar} ...

optional arguments:
  -h, --help  show this help message and exit

subcommands:
  valid subcommands

  {foo,bar}   additional help
Run Code Online (Sandbox Code Playgroud)

通缉:

>>> parser = cmdline.Parser(
...   tplheader='Usage: tool [command] [options]',
...   tplcommandhead='Available commands:',
...   tplfooter='Use \"tool help\" to get full list of supported commands.')
>>> parser.add('foo', help='foo.')
>>> parser.add('bar', help='bar.')
>>> parser.parse(['-h'])
Usage: tool [command] [options]
Available commands:

  foo        foo.
  bar        bar.

Use "tool help" to get full list of supported commands.
Run Code Online (Sandbox Code Playgroud)

更新:我接受提供命令验证和解析示例的答案,该示例将帮助消息与最后一个片段完全相同.

Rob*_*edy 6

只需更改一下argparse代码,就可以非常接近所请求的输出:

  1. 通过指定usage参数来设置用法文本ArgumentParser.
  2. 省略descriptionhelp参数add_subparsers.
  3. title参数更改为Available subcommands.
  4. 使用该metavar参数覆盖难看的{foo,bar}文本.
  5. 使用help可用的参数add_parser.

这是成品:

import argparse
parser = argparse.ArgumentParser(usage='tool [command] [options]')
subparsers = parser.add_subparsers(title='Available commands', metavar='')
subparsers.add_parser('foo', help='foo.')
subparsers.add_parser('bar', help='bar.')
parser.parse_args(['-h'])
Run Code Online (Sandbox Code Playgroud)

那段代码打印出来:

usage: tool [command] [options]

optional arguments:
  -h, --help  show this help message and exit

Available commands:

    foo       foo.
    bar       bar.


tri*_*eee 1

听起来你正在寻找argh

这是主页上演示文稿的片段。

具有多个命令的潜在模块化应用程序:

import argh

# declaring:

def echo(text):
    "Returns given word as is."
    return text

def greet(name, greeting='Hello'):
    "Greets the user with given name. The greeting is customizable."
    return greeting + ', ' + name

# assembling:

parser = argh.ArghParser()
parser.add_commands([echo, greet])

# dispatching:

if __name__ == '__main__':
    parser.dispatch()
Run Code Online (Sandbox Code Playgroud)

当然有效:

$ ./app.py greet Andy
Hello, Andy

$ ./app.py greet Andy -g Arrrgh
Arrrgh, Andy
Run Code Online (Sandbox Code Playgroud)

网站上的帮助消息略有删节。这是它实际为我输出的内容(argh0.26.1)。

$ ./app.py --help
usage: app.py [-h] {greet,echo} ...

positional arguments:
  {greet,echo}
    echo        Returns given word as is.
    greet       Greets the user with given name. The greeting is customizable.

optional arguments:
  -h, --help    show this help message and exit
Run Code Online (Sandbox Code Playgroud)