使用函数的argparse子命令解析器

5

你好,我正在学习使用argparse。我的目标是构建一个命令行界面,主要命令接受参数并重定向到相应的命令函数。以下是我迄今为止所做的事情:

def main():

    parser = argparse.ArgumentParser()
    subparsers = parser.add_subparsers()

    command1_parser = subparsers.add_parser('command1')
    command1_parser.set_defaults(func=command1)
    command1_parser.add_argument('--name', dest='name')

    command2_parser = subparsers.add_parser('command2')
    command2_parser.set_defaults(func=command2)
    command2_parser.add_argument('--frequency', dest='frequency')

    args = parser.parse_args()

def command1():

    # do something with args.name

def command2():

    # do something with args.frequency

if __name__ == '__main__':
    main()

当我执行以下操作时:
entrypoint command1 --name Hello

或者:

entrypoint command2 --frequency 10

它未能捕捉到相应的args。我做错了什么?谢谢!

请查看文档中完整的subparsers set_defaults示例。 - hpaulj
1个回答

15

因为你需要通过 args.func(args) 手动调用该函数:

import argparse

def main():
    parser = argparse.ArgumentParser()
    subparsers = parser.add_subparsers()

    command1_parser = subparsers.add_parser('command1')
    command1_parser.set_defaults(func=command1)
    command1_parser.add_argument('--name', dest='name')

    command2_parser = subparsers.add_parser('command2')
    command2_parser.set_defaults(func=command2)
    command2_parser.add_argument('--frequency', dest='frequency')

    args = parser.parse_args()
    args.func(args)

def command1(args):
    print("command1: %s" % args.name)

def command2(args):
    print("comamnd2: %s" % args.frequency)

if __name__ == '__main__':
    main()

3
如果程序在没有任何参数的情况下运行,则会在行args.func(args)处抛出错误AttributeError: 'Namespace' object has no attribute 'func' - Filip S.
@FilipS. 没错。这只是最小的更改,使原始问题的代码能够正常工作。使用此代码的人应添加相关的净化检查。 - adrtam
你可以在 subparsers = parser.add_subparsers() 中添加 required=True,让argparse为你运行检查。 - CVAUGHN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接