写深度学习脚本的时候需要设置各种参数,你还在手动在代码里修改?那你就out了,赶紧来学学argparse库的使用吧!

  python中argparse库是一个命令行参数的解析工具,利用这个库可以在命令行运行脚本时,设置参数,从而灵活的设置脚本中需要的参数。下面总结一下argparse库的使用方法。

创建parse对象

  argparse库为python自带的库,使用时直接import argparse就可以使用,第一步,我们要创建一个ArgumentParser对象,(设置的参数最终都会作为ArgumentParser对象的属性,调用方法如ArgumentParser.xxxxx),同时在其description参数中,我们可以输入想添加的提示信息。

1
2
3
import argparse

parser = argparse.ArgumentParser(description='add some useful information here....')


使用add_argument()方法添加参数

  创建了ArgumentParser对象之后,就可以使用add_argument()方法来添加参数,其输入参数如下,其中[]中的参数为可选参数,作用为设置参数的一些属性。add_argument()第一个输入参数即为我们添加的参数,当前面没有-前缀,比如'foo'时为位置参数,当带有-前缀时,为可选参数,如--foo。位置参数和可选参数的概念这里就不解释了。

1
2
ArgumentParser.add_argument(name or flags…[, action][, nargs][, const][, default]
[, type][, choices][, required][, help][, metavar][, dest])

1
2
3
4
5
import argparse

parser = argparse.ArgumentParser(description='arugment test')
parser.add_argument('foo') #位置参数
parser.add_argument('--foo2') #可选参数

  下面先总结一下,add_argument()方法中常用的一些属性:

属性值 作用
type 指定参数存储时的类型,可为int、float、str
action 指定参数的动作,可为store_const、store_true/store_false、append、count
default 指定参数的默认值
dest 指定参数的保存位置,如设置'ddd',则通过parser.ddd获取该参数值
choice 指定参数的可选项,参数只能从设置值中选择
required 说明参数是否为必须的,可以设置为True\False
help 参数的说明,用户输入--help\-h时,会显示设置的帮助信息

type

  ArgumentParser添加的参数默认存储类型为str,如果想以其他方式进行存储,就要通过设置type属性来按指定类型存储,代码和运行结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
parser = argparse.ArgumentParser(
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
description='Create an image list or \
make a record database by reading from an image list'
)
parser.add_argument('--foo')
parser.add_argument('--foo2', type=int)
parser.add_argument('--foo3', type=float)

args = parser.parse_args()
print('foo is', type(args.foo))
print('foo2 is', type(args.foo2))
print('foo3 is', type(args.foo3))

C:\Users\lenovo\Desktop\arg_test>py -3 arg_test.py --foo 1.1 --foo2 1 --foo3 0.1
foo is <class 'str'>
foo2 is <class 'int'>
foo3 is <class 'float'>


action

  action可以设置参数的动作,也就是当我们输入了该可选参数时,该参数会进行的动作。

store_const

  很简单,设置该参数的值为常量,搭配const属性使用,初始化时赋值为const中设置的值,之后程序中不允许更改参数值,这样我们可以限制一些用户的误操作,代码和运行结果如下:

1
2
3
4
5
6
parser.add_argument('--foo',action='store_const',const='this is a constant')
args = parser.parse_args()
print('foo is', args.foo)

C:\Users\lenovo\Desktop\arg_test>py -3 arg_test.py --foo
foo is this is a constant

store_true/store_false

  store_true表示,当该参数出现时,设置该参数的值为true,否则为falsestore_false则相反。

1
2
3
4
5
6
7
8
9
parser.add_argument('--foo',action='store_true')
args = parser.parse_args()
print('foo is', args.foo)

C:\Users\lenovo\Desktop\arg_test>py -3 arg_test.py --foo
foo is True

C:\Users\lenovo\Desktop\arg_test>py -3 arg_test.py
foo is False

append

  使用append后,命令行中可以为该参数赋多个值,这些值将会保存在一个列表中。

1
2
3
4
5
6
parser.add_argument('--foo',action='append')
args = parser.parse_args()
print('foo is', args.foo)

C:\Users\lenovo\Desktop\arg_test>py -3 arg_test.py --foo 1,23,5
foo is ['1,23,5']

count

  顾名思义,统计该参数出现的次数。

1
2
3
4
5
6
parser.add_argument('--foo',action='count')
args = parser.parse_args()
print('foo is', args.foo)

C:\Users\lenovo\Desktop\arg_test>py -3 arg_test.py --foo --foo --foo
foo is 3


default

  很实用的一个属性,设置参数的默认值,也就是说,当没有输入该参数时,参数默认存储default中设置的值。

1
2
3
4
5
6
7
8
9
parser.add_argument('--foo',type=str,default='default value')
args = parser.parse_args()
print('foo is', args.foo)

C:\Users\lenovo\Desktop\arg_test>py -3 arg_test.py
foo is default value

C:\Users\lenovo\Desktop\arg_test>py -3 arg_test.py --foo not-default
foo is not-default


dest

  指定参数的存储位置,该参数值将被存储为dest声明的变量中。

1
2
3
4
5
6
parser.add_argument('--foo',type=str,dest='foo_dest')
args = parser.parse_args()
print('foo is', args.foo_dest) #注意这里的调用变量为 foo_dest

C:\Users\lenovo\Desktop\arg_test>py -3 arg_test.py --foo dest_test
foo is dest_test


choice

  用户输入的参数只能是choices里面规定的,可以限制用户的输入。使程序更加鲁棒

1
2
3
4
5
6
7
8
9
10
parser.add_argument('--foo', type=int,choices=[5,6,7,8])
args = parser.parse_args()
print('foo is', args.foo)

C:\Users\lenovo\Desktop\arg_test>py -3 arg_test.py --foo 5
foo is 5

C:\Users\lenovo\Desktop\arg_test>py -3 arg_test.py --foo 1
usage: arg_test.py [-h] [--foo {5,6,7,8}]
arg_test.py: error: argument --foo: invalid choice: 1 (choose from 5, 6, 7, 8)


required

  设置该参数是否为必须,如果为True则要求用户一定要输入该参数。

1
2
3
4
5
6
7
parser.add_argument('--foo', type=int,required=True)
args = parser.parse_args()
print('foo is', args.foo)

C:\Users\lenovo\Desktop\arg_test>py -3 arg_test.py
usage: arg_test.py [-h] --foo FOO
arg_test.py: error: the following arguments are required: --foo

help

  设置参数帮助信息,可以在其中写入一些提示,告诉用户应该如何输入该参数,相当于一个帮助文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
parser.add_argument('--foo', type=int,
help = 'add some helpful message here.')
args = parser.parse_args()
print('foo is', args.foo)


C:\Users\lenovo\Desktop\arg_test>py -3 arg_test.py -h
usage: arg_test.py [-h] [--foo FOO]

Create an image list or make a record database by reading from an image list

optional arguments:
-h, --help show this help message and exit
--foo FOO add some helpful message here. (default: None)

用parse_args()方法解析参数

  添加完参数后,最后调用parse_args()方法,将会返回一个命名空间(namespace),之后我们就可以愉快的调用各个设置好的参数啦~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def parse_arg():
parser = argparse.ArgumentParser(
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
description='Create an image list or \
make a record database by reading from an image list'
)
parser.add_argument('--foo', type=int,
help='add some helpful message here.')
# parser.add_argument('--foo2', type=int)
# parser.add_argument('--foo3', type=float)

#namespace
args = parser.parse_args()
return args

总结

  总的来说,argparse库的用法还是比较傻瓜的,如果学会了,恭喜你,你再也不用在代码里面去修改参数啦~