0

我正在创建一个使用与pacmanArch Linux 相同风格的 python 脚本,总结如下:

prog <operation> [options] [targets]
  • 操作的形式是 -X(连字符,大写字母),调用脚本时需要一个。
  • 选项的形式是 -x(连字符,小写字母),并且对于不同的操作可能意味着不同的东西

例如:

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

妙语:

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

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

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

谢谢

4

3 回答 3

1

One option would be to make -S and -Q part of a mutually exclusive option group with the required keyword argument set to True. This wouldn't enforce the requirement to make those the first arguments given, nor would it restrict which other options could be used with each. You'd have to enforce the latter after calling parse_args.

Another option I thought of was to make -S and -Q subcommands. Calling add_parser with a first argument starting with '-' seems to be legal, but the errors you get when you actually try to call your script makes me think that either the support is buggy/unintended, or that the error reporting is buggy.

于 2012-08-09T19:42:01.463 回答
0

所以我发现这个对隐藏在 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)
于 2012-08-17T15:50:06.033 回答
0

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

于 2012-08-09T19:45:56.063 回答