我意识到这个问题相当笼统,但我不知道如何准确地询问我正在做的事情,但这里是。
我想创建一个工具,允许采用以下格式的选项,并且还使用自定义操作:
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)
我可以看到这些值正在被分配,但没有被调用。
我基本上想要有独占父选项,可以在没有子参数的情况下指定,但仍然允许独占子参数,就像这样,如果期望:
tool.py configure {interval|recipients}
有什么想法吗?
最佳答案
您可以将子解析器与默认函数结合使用
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
如果你想扩展子解析器,你可以这样做:
start = subparsers.add_parser("start")
start.add_argument("--foo")
关于python - 使用 argparse 创建自定义命令行格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18475448/