解析类似于archlinux pacman的命令行参数

时间:2012-08-09 18:38:48

标签: python argparse

我正在使用与Arch Linux中pacman相同的样式创建一个python脚本,总结如下:

prog <operation> [options] [targets]
  • 操作的格式为-X(连字符,大写字母),调用脚本时需要一个。
  • 选项的格式为-x(连字符,小写字母),而可能表示不同的操作

例如:

  • pacman -Syu表示使用syncrefresh选项执行sysupgrade操作,使用新软件包升级整个系统。
  • pacman -Qu表示使用query选项执行upgrades操作,列出所有过期的包。
  • pacman -Ss <arg>表示使用sync选项执行search操作,该选项需要另一个参数作为在同步包中搜索的模式。

妙语:

我一直在研究python的argparse库,试图弄清楚如何实现它。到目前为止,我遇到了一些问题/设计问题:

  • argparse仅接受以连字符为前缀的参数作为可选参数。当肯定需要时,我的所有“操作”都会显示为可选参数。
  • 我可以让我的脚本有一个“位置”/必需参数,这将是操作(我必须将操作切换为单词,如upgradeadd),然后是可选参数。但是,这仍然无法解决相同选项 - 符号 - 工作 - 不同的问题,也不会让我轻松列出--help文本中所有受支持的操作。

处理此参数解析的最流畅的方法是什么?我并不反对改变我的命令用法,但正如我上面所说的,就我所知,它似乎对我的情况没有帮助。

由于

3 个答案:

答案 0 :(得分:1)

一种选择是将-S-Q作为互斥选项组的一部分,并将required关键字参数设置为True。这不会强制要求将这些参数赋予第一个参数,也不会限制哪些参数可以与每个参数一起使用。调用parse_args后,您必须强制执行后者。

我想到的另一个选项是制作-S-Q子命令。使用以“ - ”开头的第一个参数调用add_parser似乎是合法的,但是当您实际尝试调用脚本时获得的错误让我认为支持是错误的/无意的,或者错误报告马车。

答案 1 :(得分:0)

另一种选择是使用getopthttp://docs.python.org/library/getopt.html

答案 2 :(得分:0)

所以我发现这个support for sub-commands埋没在argparse帮助中。这正是我所需要的,唯一需要注意的是我没有使用-X作为操作格式;我只是使用addsearch之类的字词。

为了完整性,这里是一个使用上面链接中的子解析器的例子:

>>> # 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)