我有以下代码
现在,当我将
我会得到:
我原本期望在未知参数的元组中获得
另外需要澄清的是,从元组中获取的
欢迎提供任何进一步的澄清和/或消除任何不确定性。
parser = argparse.ArgumentParser(allow_abbrev=False, add_help=False)
parser.add_argument('--conf', nargs=1)
parser.add_argument('-h', '--help', nargs='?', const='generic')
parser.add_argument('-v', '--version', action="store_true")
subparsers = parser.add_subparsers()
subparsers.required = False
parser_start = subparsers.add_parser('start')
group1 = parser_start.add_mutually_exclusive_group()
group1.add_argument('--quiet', action="store_true")
group1.add_argument('-V', '--verbose', nargs="*")
# parser_console = subparsers.add_parser('console')
print(argv)
parsed_args = parser.parse_known_args(argv)
现在,当我将
argv
作为 argv = ['abc', 'def']
或 argv = ['abc']
传递时,我会得到:
['abc', 'def']
usage: lbrynet [--conf CONF] [-h [HELP]] [-v] {start} ...
lbrynet: error: invalid choice: 'abc' (choose from 'start')
我原本期望在未知参数的元组中获得
['abc', 'def']
。我查看了很多stackoverflow答案(比如回答1、回答2、回答3、回答4)和bug报告(例如报告1),但似乎找不到实现的方法。这是一个未解决的问题吗?我的期望是错的吗?如果无法实现,是否有任何解决方法?另外需要澄清的是,从元组中获取的
['abc', 'def']
必须传递给其他函数进行处理。欢迎提供任何进一步的澄清和/或消除任何不确定性。
subparsers
只是一个位置参数
(带有特殊的action
参数)。由于您没有定义任何其他位置参数,第一个非标志字符串被分配给subparsers
,在那里它未通过choices
测试。argparse
将字符串分配给位置参数,然后测试其有效性,而不是相反。 - hpauljsubparsers
不是必需的,并不意味着它是一个标记(optional
)参数。这只是意味着如果你没有提供一个字符串(在positional
参数的意义上),它不会抱怨。 - hpaulj['start']
,仍然能获取额外的参数。假设我的主命令是“调用”该程序为X
。这意味着我将以X abc def
的形式运行该程序。 - hackrushabc, def
首先被标记为位置参数(模式为“AA”),然后由start
子解析器解析。但是既然abc
和def
都不匹配start
子命令,它们不应该进入start
子命令的“空间”吗? - hackrush