【发布时间】:2013-08-30 18:59:53
【问题描述】:
我意识到这个问题相当笼统,但我不知道如何确切地询问我正在做什么,但这里是。
我想创建一个允许以下格式选项的工具,该工具也使用自定义操作:
tool.py {start|stop|restart|configure}
上述每个命令都是互斥的,有些可以有单独的唯一选项。都将调用自定义操作(子类 argparse.Action)。
tool.py start
上面不会做任何事情,因为没有定义任何参数(通过“add_argument()”)。
虽然我想制作一个子解析器,但这样做最初不起作用,除非你通过“set_defaults()”设置默认参数。但是,这样做并设置:
class CustomAction(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
print('Args: %r %r %r' % (namespace, values, option_string))
setattr(namespace, self.dest, values)
parser = argparse.ArgumentParser(help="Basic daemon.")
subparsers = parser.add_subparsers()
start_parser = subparsers.add_parser("start")
start_parser.set_defaults(start=True, action=CustomAction)
似乎没有按预期启动自定义操作。以下是我得到的输出:
$ custom_parser.py start
Namespace(action=<class '__main__.BasicAction'>, start=True)
我可以看到正在分配值,但没有调用。
我基本上希望有 exclusive 父选项可以指定 没有子参数,但仍然允许 exclusive sub-arguments 像这样,如果想要的:
tool.py configure {interval|recipients}
有什么想法吗?
【问题讨论】:
-
文档显示了使用子命令调用特定函数的两种方法。一种是
setdefaults设置func属性,然后通过args.func(args)调用。另一个是subparsersdest。这会在args中设置子命令名称,然后您可以将其与表查找一起使用以调用所需的命令。 -
默认设置,无论如何设置,都不会调用操作。
set_defaults在setattr()命令处生效。这就是您在Namespace-start和action中看到的属性设置为它们各自的布尔值和类值。如果你想调用一个函数,那必须在parse_args之后完成。 -
我不知道你在用 setdefaults 做什么。您不需要指定新变量
start。也没有发生任何事情,因为您没有要求发生任何事情。您只是将一个变量设置为一个名为 BasicAction 的散列。仅仅因为您调用了 start subparser 并不意味着 argparse 将执行您的函数,您必须这样做
标签: python arguments command-line-arguments argparse