代码之家  ›  专栏  ›  技术社区  ›  erup

带函数的argparse子parser

  •  4
  • erup  · 技术社区  · 6 年前

    你好,我从 argparse . 我的目标是构建一个CLI,其中包含接受参数并重定向到相应命令函数的主命令。以下是我目前所做的:

    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 . 我做错了什么?谢谢

    1 回复  |  直到 6 年前
        1
  •  13
  •   adrtam    6 年前

    因为您需要手动调用函数 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()