python - argparse:当存在子解析器时如何分隔未知(和可选)args。(子解析器也是可选的)

标签 python argparse

我有以下代码

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 答案(例如 ans 1ans 2ans 3ans 4)和错误报告(例如 br 1)和一个很多但我可以似乎找到了一种方法来做到这一点。这是一个 Unresolved 错误吗?我期望可以做到这一点是不是错了。如果无法做到这一点,是否有任何解决方法?

还要澄清一下,必须将从元组中获取的 ['abc', 'def'] 传递给其他函数进行处理。

很高兴提供任何进一步的说明和/或消除任何歧义。

最佳答案

正如我在评论中所写,subparsers 是一个位置参数。

用一个简单的位置来说明:

In [307]: parser = argparse.ArgumentParser()
In [308]: a1 = parser.add_argument('foo')

In [309]: parser.parse_known_args(['one','two'])
Out[309]: (Namespace(foo='one'), ['two'])

'one' 分配给第一个位置。现在给 foo 选择:

In [310]: a1.choices = ['bar','test']
In [311]: parser.parse_known_args(['one','two'])
usage: ipython3 [-h] {bar,test}
ipython3: error: argument foo: invalid choice: 'one' (choose from 'bar', 'test')

它仍在尝试将第一个字符串分配给 foo。由于它与 choices 不匹配,因此会引发错误。

In [312]: parser.parse_known_args(['bar','one','two'])
Out[312]: (Namespace(foo='bar'), ['one', 'two'])

字符串是根据位置而不是值分配给位置变量的。任何值检查(例如类型或选择)都在赋值后完成。

choices 更改为 type 测试:

In [313]: a1.choices = None
In [314]: a1.type = int
In [315]: parser.parse_known_args(['bar','one','two'])
usage: ipython3 [-h] foo
ipython3: error: argument foo: invalid int value: 'bar'

In [316]: parser.parse_known_args(['12','one','two'])
Out[316]: (Namespace(foo=12), ['one', 'two'])

关于python - argparse:当存在子解析器时如何分隔未知(和可选)args。(子解析器也是可选的),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53593867/

相关文章:

python - 在 python 中——如何将项目转换为字典?

python - 如何使用 PyQt5 添加当前时间和日期小部件?

python - Argparse 字典到命名空间

python - 如何使 python 脚本在有参数和无参数(默认参数)的情况下工作?

python-2.7 - 传递 argparse 列表时导入 python 模块

python - 类型错误:格式字符串 Python3-MySQL 的参数不足

python - 我可以将枚举类型从字符串更改为字节吗?

python - Argparse 在 `choice` 参数中间吃任意字符串

python - 无法 pickle 本地对象 'ArgumentParser.__init__.<locals>.identity

python - 添加一个数字到指定索引范围内的列表