我正在实现一个命令行程序,其界面如下:
cmd [GLOBAL_OPTIONS] {command [COMMAND_OPTS]} [{command [COMMAND_OPTS]} ...]
我已经阅读了argparse文档。我可以GLOBAL_OPTIONS使用add_argumentin实现为可选参数argparse。以及{command [COMMAND_OPTS]}using子命令。
GLOBAL_OPTIONS
add_argument
argparse
{command [COMMAND_OPTS]}
从文档看来,我只能有一个子命令。但是如您所见,我必须实现一个或多个子命令。解析此类命令行参数使用的最佳方法是什么argparse?
@mgilson对这个问题有很好的答案。但是我自己拆分sys.argv的问题是我丢失了Argparse为用户生成的所有有用的帮助消息。所以我最终这样做:
import argparse ## This function takes the 'extra' attribute from global namespace and re-parses it to create separate namespaces for all other chained commands. def parse_extra (parser, namespace): namespaces = [] extra = namespace.extra while extra: n = parser.parse_args(extra) extra = n.extra namespaces.append(n) return namespaces argparser=argparse.ArgumentParser() subparsers = argparser.add_subparsers(help='sub-command help', dest='subparser_name') parser_a = subparsers.add_parser('command_a', help = "command_a help") ## Setup options for parser_a ## Add nargs="*" for zero or more other commands argparser.add_argument('extra', nargs = "*", help = 'Other commands') ## Do similar stuff for other sub-parsers
现在,在第一次解析之后,所有链接的命令都存储在中extra。我会在它不为空的情况下对其进行重新解析,以获取所有链接的命令并为其创建单独的命名空间。而且我得到了argparse生成的更好的用法字符串。
extra