确定使用哪个subparser

时间:2013-08-14 15:22:11

标签: python argparse

我正在构建一个包含多个subparser的软件,我想那些具有不同convert_arg_line_to_args定义的软件,所以我所做的就是考虑选择的subparser来替换我的解析器的功能:

parser = ArgumentParser(fromfile_prefix_chars='@')
subparsers = parser.add_subparsers(title='Available sub commands')

sub_parser = subparsers.add_parser("sub1", help="sub1")
sub_parser.add_argument("--paramsub1", required=True, dest="paramsub1")
sub_parser.set_defaults(cmd_object="sub1")

sub_parser = subparsers.add_parser("sub2", help="sub2")
sub_parser.add_argument("--paramsub2", required=True, dest="paramsub2")
sub_parser.set_defaults(cmd_object="sub2")

我想argparse不检查参数,但告诉我选择了哪个subparser:

args = vars(parser.parse_args())
if args["cmd_object"] == "sub1": parser.convert_arg_line_to_args = function1
elif args["cmd_object"] == "sub2": parser.convert_arg_line_to_args = function2
args = vars(parser.parse_args())

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您是否要检查子分析器名称,以便设置convert_arg_line_to_args功能?相反,您可以在设置期间更改该功能。

这个设置怎么样?

def function1(arg_line):
    print('function1: %r'%arg_line)
    return [arg_line]

def function2(arg_line):
    print('function2: %r'%arg_line)
    return arg_line.split()

parser = ArgumentParser()
subparsers = parser.add_subparsers(title='Available sub commands', dest='cmd_object')

sub_parser1 = subparsers.add_parser("sub1", help="sub1",fromfile_prefix_chars='@')
sub_parser1.convert_arg_line_to_args = function1
sub_parser1.add_argument("--paramsub1")

sub_parser2 = subparsers.add_parser("sub2", help="sub2",fromfile_prefix_chars='@')
sub_parser2.convert_arg_line_to_args = function2
sub_parser2.add_argument("--paramsub2")

我将fromfile_prefix_chars='@'从解析器移到了子分析器。这样解析器就不会尝试读取参数文件。

通常需要的参数定义为positional(不含--)。

使用dest='cmd_object'将subparser名称放入命名空间。 sest_defaults也有效,但是当你想将该值设置为函数(或其他非字符串)时更有用。