import argparse
parser = argparse.ArgumentParser()
parser.add_argument(
'--optional',
default=None,
const='some-const',
nargs='?',
help='optional')
subparsers = parser.add_subparsers()
subparser = subparsers.add_parser('subparser')
subparser.add_argument(
'positional',
help='positional')
args = parser.parse_args()
print args
./test.py --optional opt subparser positional
Namespace(optional='opt', positional='positional') <-- works as expected
./test.py --optional subparser positional
usage: test.py [-h] [--optional [OPTIONAL]] {subparser} ...
test.py: error: invalid choice: 'positional' (choose from 'subparser') <-- throws an error
Namespace(optional='some-const', positional='positional') <-- would expect to see this
上面是我演示这个问题的最简单的测试代码。我想要一个可选的arg,用nargs=‘?在子解析器中的位置arg之前。我读到可以将原始解析器作为父解析器传递给子子解析器,但这并不能解决问题。在尝试时,我尝试将add_help=False和冲突_处理程序=“解析”添加到初始解析器声明中。有人能为我指出正确的方向吗?
谢谢你,斯科特
发布于 2013-08-14 18:57:17
解析./test.py --optional foo bar
时,an解析会看到一个可选字符串(以--开头),后面跟着两个参数字符串(no -)
因此,它从处理--optional
开始。它是一个“贪婪的?”,所以它消耗了foo
参数,产生了:
Namespace('optional'='foo')
这使得bar
被作为子命令参数使用。
它不检查foo
是否是有效的子命令参数。
同样的推理也适用于./test.py --optional subparser positional
。
发布于 2013-01-01 22:15:16
这会引发一个错误:
.test.py --optional
因为subparser
不是可选的:
usage: subparser.py [-h] [--optional [OPTIONAL]] {subparser} ...
test.py: error: too few arguments
在您的第二个示例中,subparser
被吞食并用作OPTIONAL
。我不明白为什么,除了a解析器之外,没有事先确定子解析器是子解析器。
这是我能做的和你描述的最接近的事情:
import argparse
parent_parser = argparse.ArgumentParser(add_help=False)
parent_parser.add_argument(
'--optional',
nargs='?',
default=None,
const='some-const',
help='optional')
sub_parser = argparse.ArgumentParser(parents=[parent_parser])
sub_parser.add_argument('--subparser', required=True)
args = sub_parser.parse_args()
print args
我想你发现了一只虫子。
https://stackoverflow.com/questions/13929846
复制相似问题