在argparse中混合使用位置参数和可选参数

3

在混合使用位置参数、可选参数和 argparse.REMAINDER 时,我遇到了一个问题。

parser = argparse.ArgumentParser()
parser.add_argument('verbose', action="store")
parser.add_argument('--config', '-c', nargs="?", dest="config_file")
parser.add_argument('--dry-run', action="store_true", dest="dryrun")
parser.add_argument('args', nargs=argparse.REMAINDER, action="store")

示例运行:

python test.py verbose="5" --config config.xml graph --dry-run

预期输出:

verbose = "5"
config_file = config.xml
dryrun = True
args = ['graph']

实际输出:

verbose = "5"
config_file = config.xml
dryrun = False
args = ['graph', '--dry-run']

我的要求是我有verbose-c--config--dry-run作为命令行选项,而在命令行提供的任何其他选项都应存储在args列表中,而不管它们在命令行参数中出现的顺序如何。

请帮我看看哪里做错了。

此外,还有没有更好的Python命令行解析器?

1个回答

5
我认为你需要的配置是这样的:

    parser.add_argument('--verbose', action="store")
    parser.add_argument('-c', '--config', nargs="?", dest="config_file")
    parser.add_argument('--dry-run', action="store_true", dest="dryrun")
    parser.add_argument('args', nargs='*')

我认为你所提供的“REMAINDER”参数是告诉argparse模块在找到无法匹配的第一个参数时,将args中剩余的所有参数作为输入。
如果想要0个或者更多的args参数,请使用“*”,如果至少需要1个args参数,请使用“+”作为“nargs”参数。
此外,我建议参考argparse文档,因为有很多已经可以解析所需类型(例如int或文件参数)的可能性。对于这种情况,创建一个免费的Aptana Studio中的“CLI-argparse”模块会提供一个良好的argparse包装器,其中一些标准参数(如verbose)已经设置好了。在这种情况下,详细程度将作为整数水平显示。

我猜我的问题非常愚蠢!!但是非常感谢。你的答案解决了我的问题 :) - Vinay Surve
提问从来不是愚蠢的行为(当然,在提问之前进行一些研究是必要的)。请参见我的回答中的附加评论。 - michael_s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接