Python参数解析工具argparse.ArgumentParser()和实例详解
argparse是一个Python模块:命令行选项、参数和子命令解析器。
通过命令行运行Python脚本时,可以通过ArgumentParser
来高效地接受并解析命令行参数。
流程
新建一个ArgumentParser
类对象,然后来添加若干个参数选项,最后通过parse_args()
方法解析并获得命令行传来的参数。即主要有三个步骤:
- 创建 ArgumentParser() 对象
- 调用 add_argument() 方法添加参数
- 使用 parse_args() 解析添加的参数
import argparser parser = argparser.ArgumentParser() # 此处省略添加若干个参数选项的详细步骤 # ... parser.parse_args()
最后通过parser.<argument_name>
来获取传递过来的参数。
添加参数选项
使用add_argument()
来添加参数选项
# 添加位置参数 parser.add_argument("echo", help="echo the string you use here") parser.add_argument("square", help="display ...", type=int) # 添加可选参数 parser.add_argument("-v", "--verbosity", help="...", type=int, choices=[0, 1, 2], default=0)
对以上代码做出如下解释:
- 在使用
add_argument
来添加参数选项的时候,首先要指定参数的名字argument_name
这个属性,可选参数有长短两个名称; - 在命令行指定位置参数时直接传值,指定可选参数时,先注明长短名称,然后在后面接值;
help
提示参数的作用,type
规定了参数的取值类型,choices
以列表的形式规定了值域,default
规定了参数的默认值
参数选项组
使用add_mutually_exclusive_group()
来添加相互对立的参数选项组
一个对立的可选参数组在指定参数时,只能任选其一或都不选
# 导入模块和新建ArgumentParser类的过程省略 group = parser.add_mutually_exclusive_group() group.add_argument("-d", "--down") group.add_argument("-t", "--top") # ...
最后获取参数时,仍旧是通过parser.down
和parser.top
.
额外的小插曲
对于可选参数还有一个action
属性,常见的有store_true
和count
两种
# 指定-v可选参数时,-v等于True,否则为False parser.add_argument("-v", action="store_true") # 指定-v可选参数时,-v等于v出现的次数 parser.add_argument("-v", action="count")
示例
1.传入一个参数
首先新建一个python文件:test_argparse.py
输入一下代码进行测试:
import argparse parser = argparse.ArgumentParser(description='An argument inputs into command line') # param是参数的名字,type是要传入参数的数据类型,help是该参数的提示信息 parser.add_argument('param', type=str, help='parameter') # 获得传入的参数 args = parser.parse_args() print(args)
在命令行中输入 python test_argparse.py -h
查看帮助信息,得到以下结果:
再输入一个参数hello
来运行,即python test_argparse.py hello
结果如下:
2.操作arg字典
这里得到的Namespace(param='hello')
是一种类似于python字典的数据结构
我们可以用args.参数名
来获取参数
代码改为:
import argparse parser = argparse.ArgumentParser(description='An argument inputs into command line') # param是参数的名字,type是要传入参数的数据类型,help是该参数的提示信息 parser.add_argument('param', type=str, help='parameter') # 获得传入的参数 args = parser.parse_args() print(args.param)
再次运行,这次的结果为:
3.传入多个参数
现在运行时传入多个参数,例如 hello word 试一试,即python test_argparse.py hello world
这时程序报错,提示world参数无法识别
我们把程序修改一下,在add_argument()
中加入nargs
参数
import argparse parser = argparse.ArgumentParser(description='An argument inputs into command line') # param是参数的名字,type是要传入参数的数据类型,help是该参数的提示信息 parser.add_argument('param', type=str, nargs='+', help='parameter') # 获得传入的参数 args = parser.parse_args() print(args.param)
再次运行程序,程序正常运行,即输入python test_argparse.py hello world
其中nargs='+'
表示参数可设置一个或多个
还可以用nargs='*'
来表示参数可设置零个或多个,nargs='?'
来表示参数可设置零个或一个
4.改变数据类型
add_argument()
中的type
参数表示传入参数的数据类型,之前我们传入的是字符串,还可以传入其他类型,比如我们将str
换成int
这样我们传入的就是整型数值,传入的参数可以像正常变量一样进行使用运算等
例如运行以下代码
import argparse parser = argparse.ArgumentParser(description='An argument inputs into command line') # param是参数的名字,type是要传入参数的数据类型,help是该参数的提示信息 parser.add_argument('param', type=int, nargs='+', help='parameter') # 获得传入的参数 args = parser.parse_args() print(sum(args.param))
命令行中输入python test_argparse.py 1 2 3
输出结果如下
5.位置参数
命令行传入的参数是有位置差别的,即传入参数的先后顺序会使得运行结果不同
例如运行以下代码时
import argparse parser = argparse.ArgumentParser(description='An argument inputs into command line') # param是参数的名字,type是要传入参数的数据类型,help是该参数的提示信息 parser.add_argument('param1', type=str, help='parameter1') parser.add_argument('param2', type=str, help='parameter2') # 获得传入的参数 args = parser.parse_args() print(args.param1 + ' ' + args.param2)
命令行中输入:python test_argparse.py hello world
结果如下
命令行中输入:python test_argparse.py world hello
结果如下
因此可以看出这时先传入的参数被识别为param1
,后传入的参数被识别为param2
而如果把以下两行代码调换顺序
parser.add_argument('param1', type=str, help='parameter1') parser.add_argument('param2', type=str, help='parameter2')
命令行中输入:python test_argparse.py hello world
运行结果为
这时先传入的hello
被识别为param2
,后传入的world
被识别为param1
6.可选参数
为了避免上述位置参数会产生尴尬,毕竟不可能让每个人都记住传参的顺序,我们可以使用可选参数,可选参数类似于关键词传参,但需要在关键词前加 --
例如我们运行以下程序
import argparse parser = argparse.ArgumentParser(description='An argument inputs into command line') # param是参数的名字,type是要传入参数的数据类型,help是该参数的提示信息 parser.add_argument('--param1', type=str, help='parameter1') parser.add_argument('--param2', type=str, help='parameter2') # 获得传入的参数 args = parser.parse_args() print(args.param1 + ' ' + args.param2)
在命令行中输入:python test_argparse.py --param1=hello --param=world
结果为:
这时就算我们调换代码顺序或者传参顺序都不会改变运行结果
7.默认参数
add_argument()
中的default
参数可以为对某个参数设置默认值,当命令行没有传入该参数的值的时候,参数会设为默认值
例如运行以下代码
import argparse parser = argparse.ArgumentParser(description='An argument inputs into command line') # param是参数的名字,type是要传入参数的数据类型,help是该参数的提示信息 parser.add_argument('--param1', type=str, default='hello', help='parameter1') parser.add_argument('--param2', type=str, default='world', help='parameter2') # 获得传入的参数 args = parser.parse_args() print(args.param1 + ' ' + args.param2)
命令行中输入:python test_argparse.py
结果为
8.必需参数
add_argument
中的required
参数可以设置某个参数是否为必需
例如运行以下代码
import argparse parser = argparse.ArgumentParser(description='An argument inputs into command line') # param是参数的名字,type是要传入参数的数据类型,help是该参数的提示信息 parser.add_argument('--param1', type=str, required=True, default='', help='parameter1') parser.add_argument('--param2', type=str, default='world', help='parameter2') # 获得传入的参数 args = parser.parse_args() print(args.param1 + ' ' + args.param2)
命令行输入python test_argparse.py
结果为
但是把required改为False
再次运行时结果为
命令行输入python test_argparse.py --param=Sam
结果为
参考链接:https://zhuanlan.zhihu.com/p/56922793
参考链接:https://www.cnblogs.com/YoungF/p/12047753.html
参考链接:https://blog.csdn.net/weixin_41923539/article/details/121737565