Python 子命令中选项的argparse冲突解析器将关键字参数转换为位置参数
我有一个Python脚本,它运行两个接受相同选项的子命令,Python 子命令中选项的argparse冲突解析器将关键字参数转换为位置参数,python,argparse,Python,Argparse,我有一个Python脚本,它运行两个接受相同选项的子命令,--config。我想创建第三个子命令,它可以按顺序同时运行前两个子命令 使用argparse,我为每个子命令创建了一个子parser,以及第三个子parser,其父命令是两个子命令。我想澄清一下: subcommand1=subparsers.add_解析器('subcommand1')) 子命令1.add_参数('--config',help=“配置”) subcommand2=subparsers.add_解析器('subcomma
--config
。我想创建第三个子命令,它可以按顺序同时运行前两个子命令
使用argparse,我为每个子命令创建了一个子parser,以及第三个子parser,其父命令是两个子命令。我想澄清一下:
subcommand1=subparsers.add_解析器('subcommand1'))
子命令1.add_参数('--config',help=“配置”)
subcommand2=subparsers.add_解析器('subcommand2')
子命令2.add_参数('--config',help=“配置”)
wrappercommand=subparsers.add_解析器('wrappercommand',
父类=[subcommand1,subcommand2],
冲突(解决)
当我运行wrappercommand或子命令2时,一切正常。但是,子命令1会中断,并将其作为输出:
$ run_command.py subcommand1 --config path_to_config.ini
usage: run_command.py subcommand1 config
optional arguments:
help show this help message and exit
config The config
看起来argparse已经将关键字arg(--config)转换为位置关键字(“config”)。这是argparse解决冲突选项时的预期行为吗 我认为你正在把这个冲突处理者推向一个意想不到的、未经测试的领域。通常情况下,
父级
是不被使用的独立解析器。它们只是操作的源代码。有关-h
的冲突通过add\u help=False
处理
作为背景:使用默认的conflict\u处理程序
(error),您在创建wrapper命令
子parser时会收到错误消息:
argparse.ArgumentError: argument -h/--help: conflicting option string(s): -h, --help
在添加一些add\u help=False
之后,您仍然会得到:
argparse.ArgumentError: argument --config: conflicting option string(s): --config
resolve
冲突处理程序用某种“解决方案”替换错误消息。下面的脚本演示了正在发生的事情
resolve
处理程序删除了子命令1
操作的选项\u strings
,同时保留操作。实际上,它将两者都转换为位置。由于help
具有nargs=0
,因此它始终运行。因此,将显示帮助
\u handle\u conflict\u resolve
的目的是删除第一个参数的证据,以便添加新参数。当冲突由两个具有相同选项字符串的add_argument
命令产生时,这种方法可以正常工作。但这里的冲突是由两个家长的“复制”行为造成的。但是父操作是通过引用复制的,因此“子”中的更改最终会影响“父”
一些可能的解决办法:
- 直接将参数添加到
wrappercommand
。这种parents
机制只是将父对象的参数添加到子对象。它不会按顺序“运行”父级
- 编写自己的
\u handle\u conflict\u…
函数以正确解决冲突
- 删除冲突,这样您就可以使用
父级
,而无需使用解决
处理程序
我已经用这个例子提交了一个bug报告
:
产生:
[(3077384012L, 'config', [])]
[(3076863628L, 'config', ['--config'])]
[(3076864428L, 'help', ['-h', '--help']), (3076863628L, 'config', ['--config'])]
请注意parent1
缺少的选项\u字符串
,另2个缺少匹配的id
parent1
不能再次用作父级或解析器
在另一种情况下,通过引用复制父操作会造成复杂性(更改默认值)。您能发布完整的解析代码吗?参数应该是helper
?这是一个输入错误-应该是'help=“the config”“。谢谢,您的回答在所有方面都是正确的。我将直接将选项添加到子parser,而不使用parents
机制。
[(3077384012L, 'config', [])]
[(3076863628L, 'config', ['--config'])]
[(3076864428L, 'help', ['-h', '--help']), (3076863628L, 'config', ['--config'])]