一、模块介绍
argparse模块是python内置的一个模块,用于编写命令工具和参数解析,可以轻松编写用户友好的命令行接口。通过程序定义需要的参数,然后argparse将弄清如何从sys.argv解析出这些参数。argparse模块还会自动生成帮助和使用手册,并在用户给程序传入无效参数时报出错误信息。
二、使用流程
- 导入argparse模块
- 创建ArgmentParser()对象
- 调用add_argument()方法添加参数
- 使用parse_args()解析添加的参数
一个简单的例子如下:
# 导包
import argparse
# 创建解析器对象
parse = argparse.ArgumentParser()
# 添加参数
parse.add_argument("e")
# 解析参数
args = parse.parse_args()
print(args.e)
通过在命令行输入:python argparse_use_test.py -h查看结果:
三、位置参数
位置参数不带-或者--,按照顺序进行解析,在命令中必须出现,否则报错:
import argparse
# 创建解析器对象
parse = argparse.ArgumentParser()
# 添加位置参数
parse.add_argument("e")
# 解析参数
args = parse.parse_args()
print(args.e)
通过在命令行输入:python argparse_use_test.py -h查看结果:
四、可选参数
不影响位置参数的解析顺序。前缀--是长参数,前缀是-是短参数。
import argparse
# 创建解析器对象
parse = argparse.ArgumentParser()
# 添加参数
parse.add_argument("-a", "--A", action="store_true", help="input a number")
# 解析参数
args = parse.parse_args()
print(args.a)
通过在命令行输入:python argparse_use_test.py -h查看结果:
五、参数类型
默认的参数类型为str,如果要进行数学计算,需要在参数进行解析后进行类型转换,如果不转换就会报错。
import argparse
# 创建解析器对象
parse = argparse.ArgumentParser()
# 添加参数
parse.add_argument("a", type=int, help="input a number")
# 解析参数
args = parse.parse_args()
y = args.a
answer = y+5
print(answer)
通过设置位置参数(使用可选参数注意是选用长参数名)为int类型,然后进行计算,运行命令python argment_use_test.py 2,结果显示:
六、可选值
通过choices选项控制参数的值在固定的范围内。如下限定了可选参数b的取值范围在0,1,2之间:
import argparse
# 创建解析器对象
parse = argparse.ArgumentParser()
# 添加参数
parse.add_argument("-b", "--B", type=int, help="input a number",choices=[0,1,2])
# 解析参数
args = parse.parse_args()
y = args.B
answer = y+5
print(answer)
命令行运行python argparse_use_test.py -b 2,其结果如下所示:
七、程序用法帮助
通过在创建解析器对象时添加参数description,设置程序的用法帮助,如下代码添加使用说明“this is a simple test about argparse .”:
import argparse
# 创建解析器对象
parse = argparse.ArgumentParser(description="this is simple test about argparse .")
# 添加参数
parse.add_argument("-b", "--B", type=int, help="input a number",choices=[0,1,2])
# 解析参数
args = parse.parse_args()
y = args.B
answer = y+5
print(answer)
通过命令`python argparse_test.py -h`查看该程序的使用帮助,如下图:
八、互斥参数
通过定义互斥组来添加互斥参数,互斥组内的参数不可以同时出现,只能选择其一。比如,设置参数`--quiet`不打印过程直接输出结果,设置参数`--verbose`打印过程然后输出结果,要么选择功能打印过程的方式输出结果要么选择不打印过程的方式输出结果,二者为互斥参数。下面例子定义了两个位置参数x和y,计算x的y次方,并设置-v和-q两个可选参数,代码如下:
import argparse
# 创建解析器对象
parse = argparse.ArgumentParser(description="calculate X to the power of Y.")
# 添加参数
parse.add_argument("x",type=int, help="the base")
parse.add_argument("y", type=int, help="the expoent")
# 添加互斥组
group = parse.add_mutually_exclusive_group()
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")
# 解析参数
args = parse.parse_args()
# 计算
answer = args.x**args.y
if args.quiet:
print(answer)
elif args.verbose:
print('{} to power {} equal {}'.format(args.x, args.y, answer))
else:
print('{}^{}={}'.format(args.x, args.y, answer))
下图分别演示了使用帮助、使用-v参数执行命令、使用-q参数执行命令、不使用参数执行命令以及同时使用两个互斥参数执行命令:
九、参数默认值
通过在添加参数时,设置函数内default参数的值来设置参数的默认值。下面例子设置了可选参数-v,并设置了其默认值为1。
import argparse
# 创建解析器件对象
parser = argparse.ArgumentParser(description="this is a simple test about default argument'value")
# 添加参数
parser.add_argument("square", type=int, help="display a square of a given number")
parser.add_argument("-v", "--verbose", type=int, choices=[0,1,2], default=1, help="increase output verbose")
# 解析参数
args = parser.parse_args()
# 计算
answer = args.square**2
if args.verbose == 2:
print('the square of {} equals {}'.format(args.square, answer))
elif args.verbose == 1:
print('{}^2 == {}'.format(args.square, answer))
else:
print(answer)
由下图可知,在不设置-v参数的值时,默认-v参数的值为1,输出“{}^{} == {}”形式。
十、子解析器
子解析器存在的作用类似于对一系列的功能进行分类管理,通过设置子解析器可以使得程序的参数看起来不那么繁琐,也便于直观理解、学习和使用。首先需要添加一个父解析器,然后创建不同的子解析器。子解析器与解析器一样,可以添加位置参数、可选参数等等。下面例子实现了添加两个子解析器,分别为create和delete,然后子解析器进行参数添加。
import argparse
# 创建解析器对象
parser = argparse.ArgumentParser(description="this is a simple test about subparser")
# 添加父解析器
subparser = parser.add_subparsers(help='commands')
# 添加子解析器1
create_parser = subparser.add_parser('create', help='create a directory')
create_parser.add_argument('dirname', action='store', help='new firectory to create')
# 添加子解析器2
delete_parser = subparser.add_parser('delete', help='delete a directory')
delete_parser.add_argument('dirname', action='store', help='the directory to remove')
delete_parser.add_argument('--recursive', '-r', default=False, action='store_true', help='recurseively remove the directory')
# 解析参数
print(parser.parse_args())
下图先是演示了显示程序参数选项,再是显示子参数delete下的参数:
参考资料: