2020-05-24argparse
add_argument()函数
ArgumentParser.add_argument(name or flags[, action][, nargs][, const][, default][, type][,choices][, required][, help][, metavar ][, dest])
- name or flags:Either a name or a list option strings,e.g. foo or -f,–foo.
- action:命令行有此参数的时候 应该采取的操作
- nargs:使用命令行参数的数量
- const:操作和标记选择所需要的常量
- default:如果空缺参数时产生的值
- type:命令行值应该转换的类型
- choices:参数允许值的容器
- required:是否可以省略参数
- help:对参数的简短的描述
- metavar:变量在使用上下文中的名字
- dest:添加到parse_args()返回的对象中的属性的名称
argsparse库的使用的例子
import argparse
parser = argparse.ArgumentParser(description='命令行中传入一个数字')
#type是要传入的参数的数据类型 help是该参数的提示信息
parser.add_argument('integers', type=str, help='传入的数字')
args = parser.parse_args()
#获得传入的参数
print(args)
在这个代码中,我们在命令行传入一个数字。使用方法是打开命令行,然后在命令行中输入python demo.py -h或者python demo.py --help, 这里我输入的是
python demo.py -h
在命令行中看到demo.py的运行结果如下:
usage: demo.py [-h] integers
命令行中传入数字
positional arguments:
integers 传入的数字
optional arguments:
-h, --help show this help message and exit
现在我们在命令行中给demo.py 传入一个参数5,
python demo.py 5
运行,得到的运行结果是
Namespace(integers='5')
操作args字典
其实得到的这个结果Namespace(integers='5')是一种类似于python字典的数据类型。
我们可以使用 arg.参数名来提取这个参数
import argparse
parser = argparse.ArgumentParser(description='命令行中传入一个数字')
#type是要传入的参数的数据类型 help是该参数的提示信息
parser.add_argument('integers', type=str, help='传入的数字')
args = parser.parse_args()
#获得integers参数
print(args.integers)
在命令行中运行 python demo.py 5 , 运行结果为
5
传入多个参数
现在在命令行中给demo.py 传入多个参数,例如传入1,2,3,4四个数字
python demo.py 1 2 3 4
运行报错
usage: demo.py [-h] integers
demo.py: error: unrecognized arguments: 2 3 4
不能识别2 3 4,看源代码我们知道integers这个参数是位置参数,说明第一个数1是能识别。这里我们需要重新更改demo.py代码
import argparse
parser = argparse.ArgumentParser(description='命令行中传入一个数字')
parser.add_argument('integers', type=str, nargs='+',help='传入的数字')
args = parser.parse_args()
print(args.integers)
nargs是用来说明传入的参数个数,'+' 表示传入至少一个参数。这时候再重新在命令行中运行python demo.py 1 2 3 4得到
['1', '2', '3', '4']
改变数据类型
add_argument中有type参数可以设置传入参数的数据类型。我们看到代码中有type这个关键词,该关键词可以传入list, str, tuple, set, dict等。例如我们把上面的type=str,改成type=int,这时候我们就可以进行四则运算。
import argparse
parser = argparse.ArgumentParser(description='命令行中传入一个数字')
parser.add_argument('integers', type=int, nargs='+',help='传入的数字')
args = parser.parse_args()
#对传入的数据进行加总
print(sum(args.integers)
在命令行中输入 python demo.py 1 2 3 4, 运行结果为
10
参数的类型
位置参数 :像文件名列表一样
parser.add_argument(’ bar '),传参时不需要指明参数变量名字。(类似于函数的位置参数和可选参数一样)
可选择参数 :-f 或者 --f
parser.add_argument(’ -f ')
在传递参数时,需要明示的写出参数的名字,比如 -f FOO。结果就是将f = 'FOO'
位置参数
在命令行中传入参数时候,传入的参数的先后顺序不同,运行结果往往会不同,这是因为采用了位置参数,例如
import argparse
parser = argparse.ArgumentParser(description='姓名')
parser.add_argument('param1', type=str,help='姓')
parser.add_argument('param2', type=str,help='名')
args = parser.parse_args()
#打印姓名
print(args.param1+args.param2)
在命令行中分别输入python demo.py 张 三和python demo.py 三 张,得到的 运行结果分别为
张三
三张
如果我们将代码parser.add_argument('param1', type=str,help='姓')和
parser.add_argument('param2', type=str,help='名')互换位置,即第4行和第五行代码,再重新运行python demo.py 张 三 和 python demo.py 三 张,得到的 运行结果分别为
三张
张三
可选参数
为了在命令行中避免上述位置参数的bug(容易忘了顺序),可以使用可选参数,这个有点像关键词传参,但是需要在关键词前面加--,例如
import argparse
parser = argparse.ArgumentParser(description='姓名')
parser.add_argument('--family', type=str,help='姓')
parser.add_argument('--name', type=str,help='名')
args = parser.parse_args()
#打印姓名
print(args.family+args.name)
在命令行中输入
python demo.py --family 张 --name 三
# python demo.py --family=张 --name=三
运行结果
张三
可选参数虽然写法比较繁琐,但是增加了命令行中的可读性,不容易因为参数传入顺序导致数据错乱
默认值
add_argument中有一个default参数。有的时候需要对某个参数设置默认值,即如果命令行中没有传入该参数的值,程序使用默认值。如果命令行传入该参数,则程序使用传入的值。具体请看下面的例子
import argparse
parser = argparse.ArgumentParser(description='姓名')
parser.add_argument('--family', type=str, default='张',help='姓')
parser.add_argument('--name', type=str, default='三', help='名')
args = parser.parse_args()
#打印姓名
print(args.family+args.name)
在命令行中分别输入 python demo.py 、 python demo.py --family=李
运行结果分别为
张三
和
李三
必需参数
add_argument有一个required参数可以设置该参数是否必需。
import argparse
parser = argparse.ArgumentParser(description='姓名')
parser.add_argument('--family', type=str, help='姓')
parser.add_argument('--name', type=str, required=True, default='', help='名')
args = parser.parse_args()
#打印姓名
print(args.family+args.name)
在命令行中输入 python demo.py --family=张,运行结果
usage: demo.py [-h] [--family FAMILY] --name NAME
demo.py: error: the following arguments are required: --name
因为可选参数name的required=True,所以必须要传入。如果我们将其更改为False,程序运行结果
张
action
1:parser.add_argument('--xxxx', action='store_true', help='.....')
2:parser.add_argument('--xxxx', action='store_true',default =ture, help='.....')
3:parser.add_argument('--xxxx', action='store_true',default =ture, help='.....')
有defalt的时候xxxx的值和default 一致,true 或false
没有default的时候xxxx的值,action = store_ture,则xxxx=false,action = store_false,xxxx=true
比如在 demo1.py 中指定 action=’store_true’的时候:
parser.add_argument(‘–is_train’, action=’store_true’,default=False)
在运行的时候:
python demo1.py 默认是False
python demo1.py –is_train 是True, 注意这里没有给is_train赋值。
这个用法是“开关”的作用。
参考或转载
https://www.jianshu.com/p/4bac8c89c2d8
https://zhuanlan.zhihu.com/p/56922793
http://codingdict.com/sources/py/dateutil.parser/8518.html
https://www.cnblogs.com/piperck/p/8446580.html