Python 子命令中选项的argparse冲突解析器将关键字参数转换为位置参数

Python 子命令中选项的argparse冲突解析器将关键字参数转换为位置参数,python,argparse,Python,Argparse,我有一个Python脚本,它运行两个接受相同选项的子命令,--config。我想创建第三个子命令,它可以按顺序同时运行前两个子命令 使用argparse,我为每个子命令创建了一个子parser,以及第三个子parser,其父命令是两个子命令。我想澄清一下: subcommand1=subparsers.add_解析器('subcommand1')) 子命令1.add_参数('--config',help=“配置”) subcommand2=subparsers.add_解析器('subcomma

我有一个Python脚本,它运行两个接受相同选项的子命令,
--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'])]