美文网首页
Python3解析命令行参数

Python3解析命令行参数

作者: 多问Why | 来源:发表于2018-12-26 17:41 被阅读0次

    一种应用场景是需要处理多个mp3文件,需要在参数中指定文件列表,还有些选项可以控制处理细节。

    #!/usr/bin/env python3
    import argparse
    
    parser = argparse.ArgumentParser(description='Search some files')
    parser.add_argument(dest='filenames', metavar='filename', nargs='*')
    parser.add_argument('-p', '--pat', metavar='pattern', required=True,
                        dest='patterns', action='append',
                        help='text pattern to search for')
    parser.add_argument('-v', dest='verbose', action='store_true',
                        help='verbose mode')
    parser.add_argument('-o', dest='outfile', action='store',
                        help='output file')
    parser.add_argument('--speed', dest='speed_2', action='store',
                        choices={'slow', 'fast'}, default='slow',
                        help='search speed')
    args = parser.parse_args()
    # Output the collected arguments
    print(args.filenames)
    print(args.patterns)
    print(args.verbose)
    print(args.outfile)
    print(args.speed_2)
    

    这样可以用python temp.py -p spoon -p egg -v -o r.txt --speed=fast 1.mp3 2.mp3来运行。
    dest指定的值用作key从解析后的对象中取出用户输入。metavar用于帮助,执行-h会显示帮助。action是append时,这个参数可以出现多次,结果是一个列表。为store时,出现多次前面的会被覆盖。store_true时,结果为bool型。注意前面的中划线-不能省略。

    另一种简单但常用的场景是,这个脚本可以执行多个任务但一次只执行一种,例如
    gradle test, gradle build这样的。

    import argparse
    
    parser = argparse.ArgumentParser(allow_abbrev=False)
    
    subparsers_cmd = parser.add_subparsers(dest='cmd', help='commands')
    subparsers_cmd.add_parser('clear')
    parser_test = subparsers_cmd.add_parser('test')
    subparsers_cmd.add_parser('build')
    
    args=parser.parse_args()
    if not args.cmd:
        print(parser.print_help())
        raise SystemExit(1)
    print(args.cmd)
    

    这样用户只能从指定的三个子命令中选择一个执行,如:python3 temp.py test

    还可以指定每个子命令默认执行的函数。

    import argparse
    
    def test():
        print("test start")
    
    def build():
        print("build start")
    
    parser = argparse.ArgumentParser(allow_abbrev=False)
    
    subparsers_cmd = parser.add_subparsers(dest='cmd', help='commands')
    subparsers_cmd.add_parser('clear')
    
    parser_test = subparsers_cmd.add_parser('test')
    # run_func can change to other names
    parser_test.set_defaults(run_func=test)
    
    parser_build = subparsers_cmd.add_parser('build')
    parser_build.set_defaults(run_func=build)
    
    args = parser.parse_args()
    if not args.cmd:
        print(parser.print_help())
        raise SystemExit(1)
    args.run_func()
    print(args.cmd)
    

    当然子命令还可以再加与之对应的参数:

    import argparse
    
    parser = argparse.ArgumentParser(allow_abbrev=False)
    
    subparsers_cmd = parser.add_subparsers(dest='cmd', help='commands')
    subparsers_cmd.add_parser('clear')
    
    parser_test = subparsers_cmd.add_parser('test')
    parser_test.add_argument('-v', dest='verbose', action='store_true',
                             help='verbose mode')
    parser_test.add_argument('-p', '--pat', metavar='pattern', required=True,
                        dest='patterns', action='append',
                        help='text pattern to search for')
    parser_build = subparsers_cmd.add_parser('build')
    
    args = parser.parse_args()
    if not args.cmd:
        print(parser.print_help())
        raise SystemExit(1)
    print(args.cmd)
    if args.cmd == 'test':
        print(args.verbose)
        print(args.patterns)
    

    相关文章

      网友评论

          本文标题:Python3解析命令行参数

          本文链接:https://www.haomeiwen.com/subject/euxklqtx.html