如何在自动描述中设置argparse子命令

时间:2015-03-31 16:47:24

标签: python argparse

考虑以下代码:

$ cat a.py 
import argparse
if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    subparsers = parser.add_subparsers()

    parser_a = subparsers.add_parser('a', help='A')
    parser_b = subparsers.add_parser('b', help='B')
    parser_c = subparsers.add_parser('c', help='C')

    args = parser.parse_args()

简单的调用:

$ python a.py --help
usage: a.py [-h] {a,c,b} ...

positional arguments:
  {a,c,b}
    a         A
    b         B
    c         C

optional arguments:
  -h, --help  show this help message and exit

为什么位置参数列为{a,c,b}而不是{a,b,c},尤其是如何解决此问题?我有6个子命令,帮助看起来很难看。

这是Python 2.7.7 FWIW。

2 个答案:

答案 0 :(得分:1)

可以显示(打印),subparsers.choices吗?它应该是OrderedDict

{}来自.choices的{​​{1}}属性。虽然这可以是任何可迭代的(列表,字典等),但当前subparsers代码会生成argparse,它应按照添加顺序显示密钥。

我不知道这种行为有什么变化,至少在过去的几年里没有。但我可以深入了解它的历史。

您可以通过提供OrderedDict subparsers值来更改显示,例如

metavar

http://bugs.python.org/issue9026

是将其设置为OrderedDict的错误修复。在2011年3月关闭。

答案 1 :(得分:0)

好的,罪魁祸首是setuptools和scoop。使用setup.py安装后者时,它会在argparse>=1.1中请求install_require。下载并安装arparse 1.2.1(这本身就很疯狂,因为在PyPI中有1.2.21.3,除了"系统" argparse,它是{{ 1}},来自python 2.7)。

安装1.1之后,会出现我的问题中描述的错误行为。并删除它,解决了问题。

我报告了the bug要采取行动。