在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 开发者有很大帮助。