您的位置:

Python argparse实现命令行参数解析与处理

在Python中,命令行参数处理在很多情况下非常有用。Python标准库中提供了 argparse 模块实现命令行参数解析,本文将从基本概念、常用参数、多个子命令等多个方面来详细阐述。

一、基本概念

argparse 是 Python 标准库中的一个用于处理命令行参数的模块,它可以解析命令行参数,并在使用帮助功能时生成漂亮的输出。Argparse 模块提供了一种简单的方式来定义命令行参数和帮助文本,在Python脚本中使用这些参数。

argparse 模块中最常用的对象是 ArgumentParser。当创建 ArgumentParser 对象时,可以向它添加参数和参数组。

    import argparse

    parser = argparse.ArgumentParser(description='Process some integers.')

定义了 ArgumentParser 对象之后,就可以向它中添加参数了。

    parser.add_argument('integers', metavar='N', type=int, nargs='+',
                        help='an integer for the accumulator')
    parser.add_argument('--sum', dest='accumulate', action='store_const',
                        const=sum, default=max,
                        help='sum the integers (default: find the max)')

最后,使用 ArgumentParser 对象的 parse_args() 方法将解析好的参数打包到一个 Namespace 对象中。

    args = parser.parse_args()
    print(args.accumulate(args.integers))

二、常用参数

argparse 允许添加很多种不同类型的参数,一些常用的参数如下所述。

1. 位置参数

位置参数是在解析器读取时按定义顺序读取并解析的参数。当定义位置参数时,会指定参数名称和数据类型。

    parser.add_argument("echo", help="echo the string you use here")

2. 可选参数

可选参数是指用户不必指定的参数。即,用户可以省略该参数并使用默认值。可选参数需要指定一个参数标志(或称选项)和相应的数据类型。

    parser.add_argument("--verbosity", help="increase output verbosity")

可选参数也可以使用简短选项标志。在 argparse 模块中,这被称为短选项。短选项是仅由一个字符组成的参数标志,通常用在命令行中可重用计数器或开关上。例如 -v 用于指定输出冗余程度。

    parser.add_argument("-v", "--verbose", help="increase output verbosity",
                        action="store_true")

3. 互斥参数

argparse 中可以处理互斥参数。互斥参数是指,在命令行中不可能同时指定的两个参数。例如,在 ls 命令中,指定 -a 和 -l 是互斥的。在 argparse 中,可使用 mutually_exclusive_group() 定义一个互斥参数。

    group = parser.add_mutually_exclusive_group()
    group.add_argument("-v", "--verbose", action="store_true")
    group.add_argument("-q", "--quiet", action="store_true")

4. 带参数的选项

在 argparse 中,选项也可以带参数,例如 -f file 或 --file file。参数类型可以是任意托管的 Python 基本类型。此外,还可以将单个参数视为多个参数,例如一个字符串列表,一个整数或一个文件。

    parser.add_argument("-f", "--file",
                        help="specify an output file",
                        metavar="FILE")

三、多个子命令

argparse 模块还支持多个子命令的处理,即 Python 脚本可以支持多个命令。

使用 add_subparsers() 方法创建一组子命令。对于每个子命令,创建一个子解析器并添加一个新参数属性命名为 func。

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

    # create the parser for the "spam" command
    parser_a = subparsers.add_parser('a')
    parser_a.set_defaults(func=a)

    # create the parser for the "bacon" command
    parser_b = subparsers.add_parser('b')
    parser_b.set_defaults(func=b)

在定义好子解析器之后,您可以根据命名空间执行任何命令。

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

四、完整代码

    import argparse

    def a(args):
        print("This is command a")

    def b(args):
        print("This is command b")

    # Create the parser
    parser = argparse.ArgumentParser()

    # create subparsers
    subparsers = parser.add_subparsers()

    # create the parser for the "a" command
    parser_a = subparsers.add_parser("a")
    parser_a.set_defaults(func=a)

    # create the parser for the "b" command
    parser_b = subparsers.add_parser("b")
    parser_b.set_defaults(func=b)

    # Parse the args
    args = parser.parse_args()
    args.func(args)

五、总结

argparse 模块非常方便,可以轻松地处理命令行参数。本文介绍了 argparse 模块的基本概念、常用参数和多个子命令等多个方面,对于使用 argparse 模块的 Python 开发者有很大帮助。