根据argparse值

时间:2016-02-23 11:46:12

标签: python argparse

我需要以下列风格为我的程序构建帮助

  • run.py -h - >通用帮助
  • run.py module1 -h - >生成模块的帮助文本 build_help(mod)
  • run.py module1 submodule1 -h - >也给出了给定子模块(submodule1)的帮助文本 由函数生成。

第一部分非常简单。第3名是第2名的延伸。但我无法实施第二部分。

我尝试使用subparser,但据我所知,我应该编写太多代码来实现它。例如:

subparsers = parser.add_subparsers()
parser_module1 = subparsers.add_parser('module1')
parser_module1.set_defaults(func=build_help)

并为每个模块迭代最后2行。

如果使用只有一个 subparser,我也可以实现:

subparsers = parser.add_subparsers()
parser_module = subparsers.add_parser('module')
parser_module.add_argument('name', help='Module name')
parser_module.set_defaults(func=build_help)

但后来我将被迫修改第二部分

run.py module module1 -h

如果我不想更改呼叫模式(我需要保留run.py module1 -h模式),如何实施第二部分帮助?

UPD。我知道,有很多外部库可能会这样做。例如,getoptdocoptclickconsoleargs等。但我真的不想为此任务创建外部依赖项。

1 个答案:

答案 0 :(得分:1)

argparse.ArgumentParser(add_help=False)关闭了自动help机制。换句话说,它不会自动创建响应-h的参数。然后,您可以定义自己的-h参数。

当我创建常规解析器时:

In [56]: parser = argparse.ArgumentParser()

In [57]: parser
Out[57]: ArgumentParser(prog='ipython2.7', usage=None, description=None, version=None, formatter_class=<class 'argparse.HelpFormatter'>, conflict_handler='error', add_help=True)

In [59]: parser._actions
Out[59]: [_HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None)]

_actions列表包含-h操作。查看argparse._HelpAction类,了解它的特殊功能。基本上它会显示帮助并调用sys.exit

例如,我可以创建一个行为相同但响应-q的行动:

In [62]: parser.add_argument('-q',action='help')
Out[62]: _HelpAction(option_strings=['-q'], dest='q', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help=None, metavar=None)

In [63]: parser.parse_args(['-q'])
usage: ipython2.7 [-h] [-q]

optional arguments:
  -h, --help  show this help message and exit
  -q
An exception has occurred, use %tb to see the full traceback.

SystemExit: 0

To exit: use 'exit', 'quit', or Ctrl-D.

Subparsers会发出不同的帮助,因为主解析器在遇到-h之前会遇到subparser名称。所以它是发出帮助的subparser,而不是主解析器。

希望这个描述为您提供构建您需要的构建块。如果您需要更详细的帮助,我们可以进行更多对话。

请注意我使用ipython作为示例。它使用argparse。但它在调用解析器之前捕获-h/help中的sys.argv。因此,它可以完全控制帮助消息。

另一个自定义路线 - 定义您自己的parser.format_help功能。