python - 使用 argparse 创建自定义命令行格式

标签 python arguments command-line-arguments argparse

我意识到这个问题相当笼统,但我不知道如何准确地询问我正在做的事情,但这里是。

我想创建一个工具,允许采用以下格式的选项,并且还使用自定义操作:

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/

相关文章:

python - 如果找不到数据框列,则替换列值

python - 如何根据某些列从 pandas 数据框中选择相同的行

python - 素数查找函数的优化

python - 指定带空格的参数以运行 python 脚本

python - 如何从我们正在爬取的网页上的链接网页中爬取数据

grails - 在grails中传递 boolean 值而不是 boolean 值

javascript - 参数对象正在将我的数组转换为列表? javascript

java - 如何使用包含双引号的参数从 Java 启动进程

command-line-arguments - 如何访问 Nim 中的命令行参数?

c - 为什么在将 main 声明为 `int main(void)` 时传递命令行参数时没有错误?