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