argparse模块-命令行读取参数
前言:最近遇到了argparse模块的使用,一开始的时候一脸懵逼,于是找了资料终于是明白了一点,记录在下,如有错误,希望得到指正。
认识:
举一个小例子,在命令行窗口输入python,我们可以查询到相关的python信息,但是如果我们想要进一步查看python的版本信息,那我们需要输入 python --version ,在里 --version 被称为可选参数,我们指定了 --version 这个参数,所以最后仅仅输出python的版本信息。
在多个文件或者不同语言协同的项目中,python脚本经常需要从命令行直接读取参数。这个时候argparse模块就提供了极大地便利,比如说python脚本需要多个参数,并且每 个参数的类型不尽相同,这个时候我们就可以很方便的通过argparse模块来进行设置传递不同的参数。
一般步骤:
1. 导入argparse模块
使用 import argparse 来导入模块
2. 创建ArgumentParser() 对象
parser = argparse.ArgumentParser()
parser为创建的新对象
3. 调用 add_argument() 方法添加参数
parser.add_argument()
在此函数可以对参数进行设置,比如说种类,默认值等等,下面我们会详细探讨
4. 使用 parse_args() 解析添加的参数
args = parser.parse_args()
args是一个namespace空间,解析的参数保存在里面
具体代码举例:
一般情况
将下面代码保存为parser.py
import argparse parser = argparse.ArgumentParser() #分别增加两个可选参数para1、para2,类型为int parser.add_argument('--para1', type=int, help='display an para1') parser.add_argument('--para2', type=int, help='display an para2') args = parser.parse_args() if args.para1: print(args.para1) else: print(args.para2)
运行的命令及结果:
#运行 python parser.py #结果 None #----------------------------------------------------- #运行 python parser.py -h #结果 usage: parser.py [-h] [--para1 PARA1] [--para2 PARA2] optional arguments: -h, --help show this help message and exit --para1 PARA1 display an para1 --para2 PARA2 display an para2 #----------------------------------------------------- #运行 python parser.py --para1 10 #结果 10 #----------------------------------------------------- #运行 python parser.py --para2 50 #结果 50 #----------------------------------------------------- #运行 python parser.py 10 #结果 usage: parser.py [-h] [--para1 PARA1] [--para2 PARA2] parser.py: error: unrecognized arguments: 10 #-----------------------------------------------------
----------------------------------------------------------------------------------------------------
第一个输出None, 是因为我们并没有传入任何参数
----------------------------------------------------------------------------------------------------
第二个-h可以认为是自带的可选参数,输出我们增加的参数的所有信息
----------------------------------------------------------------------------------------------------
第三个我们输入 --para1 10, 意思是我们将10这个参数作为键值传入给para1存在args字典中
----------------------------------------------------------------------------------------------------
第四个我们输入 --para2 50, 意思是我们将50这个参数作为键值传入给para2存在args字典中
----------------------------------------------------------------------------------------------------
第五个输出error,是因为我们只输入了一个值,但是却没有指定这个值属于哪个参数,因而出错
----------------------------------------------------------------------------------------------------
必需参数
确保某些必需的参数有输入,我们将增加para1参数的代码改为如下所示
parser.add_argument('--para1', type=int, required=True, help='display an para1')
所得结果为:
usage: parser.py [-h] --para1 PARA1 [--para2 PARA2]
parser.py: error: the following arguments are required: --para1
位置参数:
位置参数没有 -- 标签,一般按照输入的先后顺序进行赋值,并且如果没有赋值或者赋值数量不够都会报错
import argparse parser = argparse.ArgumentParser() parser.add_argument('para1', type=int, help='display an para1') parser.add_argument('para2', type=int, help='display an para2') args = parser.parse_args() print('para1 is %d'%(args.para1)) print('para2 is %d'%(args.para2))
运行为:
输入: python parser.py 10 20 结果: para1 is 10 para2 is 20 -------------------------------------------------------- 输入: python parser.py 10 结果: usage: parser.py [-h] para1 para2 parser.py: error: the following arguments are required: para2 --------------------------------------------------------
PS:可以使用nargs参数来限定输入的位置参数的个数,默认为1。nargs参数也可用于普通带标签的参数。
此时多个参数值以list的形式作为键值
将para1参数改为
parser.add_argument('para1', type=int, nargs=2, help='display an para1') #print也要修改一下,因为上述打印方式不能打印list print(args.para1)
输出:
输入 python parser.py 10 20 30 输出 [10, 20] para2 is 30
默认参数值
有时候我们对于不需要改动的参数不用每次都操作进行输入,我们可以借助default这个参数,给予其默认值
将代码改为如下并保存
import argparse parser = argparse.ArgumentParser() #此处如果是位置参数,则default参数不起作用 parser.add_argument('--para1', type = int ,default= 6 , help='display an para1') args = parser.parse_args() print(args.para1)
在命令行输入: python parser.py
输出: 6
选择参数
这个参数值我认为很有用,将参数值的获取限定在某个范围内
编辑代码:
import argparse parser = argparse.ArgumentParser() parser.add_argument('para1', type = int ,choices = [1,2,3,4,5], help='display an para1') args = parser.parse_args() print(args.para1)
如果输入: python parser.py 6
输出会出现error:
usage: parser.py [-h] {1,2,3,4,5} parser.py: error: argument para1: invalid choice: 6 (choose from 1, 2, 3, 4, 5)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
疑问:关于default参数的使用,对于位置参数来说,使用default仿佛并没有起到什么作用,如果不传递值得话还是会报错