我需要以下列风格为我的程序构建帮助:
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。我知道,有很多外部库可能会这样做。例如,getopt,docopt,click,consoleargs等。但我真的不想为此任务创建外部依赖项。
答案 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
功能。