Python Argparse位置参数和可选参数的顺序不正确

Python Argparse位置参数和可选参数的顺序不正确,python,command-line,command-line-arguments,argparse,Python,Command Line,Command Line Arguments,Argparse,为什么argparse不能解析这些参数 --foo 1 2 3 bar 使用 这会产生以下错误: 错误:参数太少 但是,如果我先通过bar参数,它会起作用: bar --foo 1 2 3 现在,这本身并不太糟糕。我可以先使用位置参数,只是这种行为与argparse为我们创建的帮助不一致,argparse指出bar应该是最后一个: 用法:argparsetest.py[-h][--foo-foo [FOO…]]酒吧 那么,如何使用一致的帮助文本来实现这一点呢 这是一个完整的示例。nar

为什么argparse不能解析这些参数

--foo 1 2 3 bar
使用

这会产生以下错误:

错误:参数太少

但是,如果我先通过bar参数,它会起作用:

bar --foo 1 2 3   
现在,这本身并不太糟糕。我可以先使用位置参数,只是这种行为与argparse为我们创建的帮助不一致,argparse指出bar应该是最后一个:

用法:argparsetest.py[-h][--foo-foo [FOO…]]酒吧

那么,如何使用一致的帮助文本来实现这一点呢


这是一个完整的示例。

nargs='+'
告诉argparse将所有剩余的arg集合在一起,因此包含了
bar
。它没有神奇的方法来猜测您想要的
bar
本身是一个有意义的参数,而不是
--foo
的参数的一部分

文档中的示例引用了一个简单的
--foo
参数,而不是带有
nargs='+'
的参数。请务必理解其中的区别。

是否可以尝试执行--input--output标志,并在add_参数中将这些选项设置为required=True


很容易实现它,因此最后n个参数被视为n个必需的位置参数。这不是魔术,我想这只是一个设计决定。谢谢,这很有效,给了我一致的帮助文本。唯一的缺点是额外的输入标志部分,但我可以接受。干杯为了澄清问题,建议的解决方案是使用parser.add_参数('--bar',required=True)。然后可以传递以下参数:--foo 1 2 3--bar barRan到刚才的同一个问题中。可以使用
--
结束
nargs
globbing,因此
--foo 1 2 3--bar
应该在上面的示例中起作用。在我看来,它确实应该自动解决,保留位置参数所需的参数数量。在和上有关于这个公开问题的讨论(至少应该清楚地记录在案)。
--
停止列表太酷了。这是我最喜欢的答案。
bar --foo 1 2 3