我正在使用与Arch Linux中pacman
相同的样式创建一个python脚本,总结如下:
prog <operation> [options] [targets]
例如:
pacman -Syu
表示使用sync
和refresh
选项执行sysupgrade
操作,使用新软件包升级整个系统。pacman -Qu
表示使用query
选项执行upgrades
操作,列出所有过期的包。pacman -Ss <arg>
表示使用sync
选项执行search
操作,该选项需要另一个参数作为在同步包中搜索的模式。妙语:
我一直在研究python的argparse库,试图弄清楚如何实现它。到目前为止,我遇到了一些问题/设计问题:
argparse
仅接受以连字符为前缀的参数作为可选参数。当肯定需要时,我的所有“操作”都会显示为可选参数。upgrade
或add
),然后是可选参数。但是,这仍然无法解决相同选项 - 符号 - 工作 - 不同的问题,也不会让我轻松列出--help
文本中所有受支持的操作。处理此参数解析的最流畅的方法是什么?我并不反对改变我的命令用法,但正如我上面所说的,就我所知,它似乎对我的情况没有帮助。
由于
答案 0 :(得分:1)
一种选择是将-S
和-Q
作为互斥选项组的一部分,并将required
关键字参数设置为True
。这不会强制要求将这些参数赋予第一个参数,也不会限制哪些参数可以与每个参数一起使用。调用parse_args
后,您必须强制执行后者。
我想到的另一个选项是制作-S
和-Q
子命令。使用以“ - ”开头的第一个参数调用add_parser
似乎是合法的,但是当您实际尝试调用脚本时获得的错误让我认为支持是错误的/无意的,或者错误报告马车。
答案 1 :(得分:0)
另一种选择是使用getopt
:http://docs.python.org/library/getopt.html
答案 2 :(得分:0)
所以我发现这个support for sub-commands埋没在argparse帮助中。这正是我所需要的,唯一需要注意的是我没有使用-X
作为操作格式;我只是使用add
和search
之类的字词。
为了完整性,这里是一个使用上面链接中的子解析器的例子:
>>> # create the top-level parser
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--foo', action='store_true', help='foo help')
>>> subparsers = parser.add_subparsers(help='sub-command help')
>>>
>>> # create the parser for the "a" command
>>> parser_a = subparsers.add_parser('a', help='a help')
>>> parser_a.add_argument('bar', type=int, help='bar help')
>>>
>>> # create the parser for the "b" command
>>> parser_b = subparsers.add_parser('b', help='b help')
>>> parser_b.add_argument('--baz', choices='XYZ', help='baz help')
>>>
>>> # parse some argument lists
>>> parser.parse_args(['a', '12'])
Namespace(bar=12, foo=False)
>>> parser.parse_args(['--foo', 'b', '--baz', 'Z'])
Namespace(baz='Z', foo=True)