我意识到这个问题相当普遍,但我并不确切地知道如何询问我正在做什么,但是这里有。
我想创建一个工具,允许使用以下格式的选项,该格式也使用自定义操作:
tool.py {start|stop|restart|configure}
上述每个命令都是互斥的,有些可以有独立的选项。所有人都会调用自定义动作(子类化为argparse.Action)。
tool.py start
上述操作无效,因为没有定义任何参数(通过“add_argument()”)。
我虽然做了一个subparser,但是这样做最初不起作用,除非你通过“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)
我可以看到值已被分配,但未被调用。
我基本上希望拥有独占父选项,可以指定不带子参数,但仍允许独占子参数,如果期望的:
tool.py configure {interval|recipients}
有什么想法吗?
答案 0 :(得分:1)
您可以使用与默认功能相结合的子分析器
def start_something():
do_starting_actions()
def stop_something():
do_terminal_actions()
def parse_args():
parser = ArgumentParser()
subparsers = parser.add_subparsers()
start = subparsers.add_parser("start")
start.set_defaults(func=start_something)
stop = subparsers.add_parser("stop")
stop.set_defaults(func=stop_something)
# ...
return parser.parse_args()
def main():
args = parse_args()
args.func()
然后你可以从命令行调用解析器
mymodule.py start
如果您想扩展subparser,可以这样做:
start = subparsers.add_parser("start")
start.add_argument("--foo")