Python Argparse子parser

Python Argparse子parser,python,argparse,subparsers,Python,Argparse,Subparsers,我正在使用Argparse模块解析命令行选项。我有一个调用下标a或下标B的主脚本。我现在有一个a和B的子解析器实例和主解析器实例,它应该包含a和B需要的变量的信息。比如: def __init__(self): parser = argparse.ArgumentParser("Parser") parser.addArgument('--input') #this should be availabe for A and B subparsers = parser.a

我正在使用Argparse模块解析命令行选项。我有一个调用下标a或下标B的主脚本。我现在有一个a和B的子解析器实例和主解析器实例,它应该包含a和B需要的变量的信息。比如:

def __init__(self):
    parser = argparse.ArgumentParser("Parser")
    parser.addArgument('--input') #this should be availabe for A and B

    subparsers = parser.add_subparsers('Description')
    A_parser = subparsers.add_parser(A)
    A_paser.add_argument('--a_option')

    B_parser = parser.add_subparser('Description')
    B_parser.add_arguemnt('--b_option')

    args = parser.parse_args()
但是如果我这样使用它,我只能通过--input选项更改args.options,如果我没有在程序调用中指定A或B。执行

program.py A --input ./


两者都失败了。

我想你把python文档中的示例用法搞糟了。我试图编辑您的代码示例,但由于拼写错误太多,我放弃了。尤其是
add_subparser()
add_parser()
的用法混淆了

清理后的(自包含的)代码版本如下所示:

import argparse
parser=argparse.ArgumentParser(“解析器”)
parser.add_参数('--input')#这应该适用于A和B
subparsers=parser.add_subparsers(help='Description')
A_parser=subparser.add_parser('A'))
A_解析器。添加_参数('--A_选项')
B_parser=子parser.add_parser('B'))
B_解析器。添加_参数('--B_选项')
现在你可以打电话了

args=parser.parse_args(['--input',foo'])
而且

args=parser.parse_args(['--input',bar',A','--A_option',A_option_arg'))

args=parser.parse_args(['--input',baz',B','--B_option',B_option_arg'))

更新

在评论中,您会问:

我是否也可以为--input选项传递未知数量的参数,然后仍然有a选项?类似于:
program.py--input./../../../../A-A_选项

如果要将未知数量的参数传递给
--input
选项,则需要将
nargs='*'
传递给
--input
的参数定义。但是,您不能再使用像
A
B
这样的标记来选择子parser,因为它们将被视为
--input
的进一步参数

在这种情况下,您可以求助于父解析器。使用父解析器,您可以将多个解析器的选项合并为一个:

import argparse
A_parser=argparse.ArgumentParser(add_help=False)
A_解析器。添加_参数('--A_选项')
B_parser=argparse.ArgumentParser(add_help=False)
B_解析器。添加_参数('--B_选项')
parser=argparse.ArgumentParser(“parser”,parser,parser=[A\u parser,B\u parser])
parser.add_参数('--input',nargs='*')#这应该适用于A和B
现在,每次都可以使用所有选项:

args=parser.parse_args(['--input',foo'])
args=parser.parse_args(['--input',foo',bar','--a_option',a_option_arg']))
args=parser.parse_args(['--input',baz','--b_option',b_option_arg']))
请注意,不再有“A”和“B”标记。通过选择由
A\u解析器定义的选项之一来选择“A”。它甚至可以同时使用以下两种:

args=parser.parse_args(['--input',foo','--a_option',a_option_arg','--b_option',b_option_arg'))

如果您不希望这样做,则需要对冲突参数进行检查。

只有在--input为store_true或后面有定义数量的参数时,此方法才有效。是否有可能I也可以为--input选项传递未知数量的参数,然后仍然有a选项?类似于:program.py--input./../../../../A-A_选项主解析器无法判断--input的参数何时停止,子parser名称何时开始。它通过位置而不是值来检查类似的东西。
program.py --input ./ A