前言
在使用python时,比如训练模型,我们可能有许多超参数需要修改,而如果只能在代码中将超参修改,有点麻烦。我们可以使用类似命令行中的参数,这样当用户在命令行中运行python文件时,可以附带上参数名和自定义的参数值。
参考
- argparse — Parser for command-line options, arguments and sub-commands
- Argparse Tutorial
- Python | 使用argparse解析命令行参数
使用
基础使用
parser = argparse.ArgumentParser("parse")
print(parser)
PS D:\curriculum\cspcodes> python parse.py
ArgumentParser(prog='parse', usage=None, description=None, formatter_class=<class
'argparse.HelpFormatter'>, conflict_handler='error', add_help=True)
可以看到,新建了一个ArgumentParser
,传入的use the parser
是参数prog
,代表程序名称。
一般使用方法如下所示,新建一个ArgumentParser
后,通过add_argument
添加我们希望添加的参数,之后通过parse_args
函数就能将用户传入的参数放到args中,并使用。
parser = argparse.ArgumentParser("use the parser")
parser.add_argument("echo")
args = parser.parse_args()
print(args.echo)
PS D:\curriculum\cspcodes> python parse.py thisIsEcho
thisIsEcho
可以看到,通过args.xxx
就可以访问我们传入的参数。
Positional arguments
上面我们设定了参数echo
,就是Positional arguments我们必须要传入,否则报错。
PS D:\curriculum\cspcodes> python parse.py
usage: use the parser [-h] echo
use the parser: error: the following arguments are required: echo
Optional arguments
-xxx 可选参数
此外,我们可以设定可选参数,即用户可以传入,也可以不传入。
parser = argparse.ArgumentParser("use the parser")
parser.add_argument("echo")
parser.add_argument('-option')
args = parser.parse_args()
print(args.echo)
print(args.option)
通过-xxx
就可以设置可选参数xxx
,上面我们设置了可选参数option
。
PS D:\curriculum\cspcodes> python parse.py isEcho
isEcho
None
可以看到,如果我们不传入可选参数,那么就会赋值None
。
PS D:\curriculum\cspcodes> python parse.py isEcho -option isOption
isEcho
isOption
可以看到,通过-option xxxx
就可以传入参数xxxx
。
–xxx 可选参数
另外,我们可以用--xxxx
设置可选参数。
parser = argparse.ArgumentParser("use the parser")
parser.add_argument('-o', '--option')
args = parser.parse_args()
print(args.option)
PS D:\curriculum\cspcodes> python parse.py -o isO
isO
PS D:\curriculum\cspcodes> python parse.py --option isO
isO
上面两种情况都可以设置参数option
,我们可以认为,参数option
的完整使用是--option
,但是为了方便,我们可以使用-o
,类似于简称。只能通过args.option
获取参数。
add_argument()方法
ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
1. help
制定参数的描述帮助信息。
parser = argparse.ArgumentParser("use the parser")
parser.add_argument('--option', help="this is option")
args = parser.parse_args()
PS D:\curriculum\cspcodes> python parse.py -h
usage: use the parser [-h] [--option OPTION]
optional arguments:
-h, --help show this help message and exit
--option OPTION this is option
可以看到,能够输出可选参数option
的帮助信息。
2. type和default
分别是确定参数的数据类型和默认值,不通过default
设置默认值,那么不传入参数时会设置为None
。
parser = argparse.ArgumentParser("use the parser")
parser.add_argument('--option', help="this is option", type=int, default=10)
args = parser.parse_args()
print(args.option)
PS D:\curriculum\cspcodes> python parse.py --option 23
23
PS D:\curriculum\cspcodes> python parse.py
10
3. choices
这里是为参数确定可选值,我们传入的值只能从那里面选,但是default
可以不受其限制。
parser = argparse.ArgumentParser("use the parser")
parser.add_argument('--option', help="this is option", type=int, default=10, choices=[1, 2, 3])
args = parser.parse_args()
print(args.option)
PS D:\curriculum\cspcodes> python parse.py
10
PS D:\curriculum\cspcodes> python parse.py --option 2
2
PS D:\curriculum\cspcodes> python parse.py --option 20
usage: use the parser [-h] [--option {1,2,3}]
use the parser: error: argument --option: invalid choice: 20 (choose from 1, 2, 3)
4. nargs
类似于表示我们对一个参数,期望输入多少个值。例如:
- nargs = n
parser = argparse.ArgumentParser("use the parser")
parser.add_argument('--option', help="this is option", type=int, nargs=3, default=10)
args = parser.parse_args()
print(args.option)
这里nargs=3
表示对于参数我们应该输入3个值,之后会将其组织成list
。
PS D:\curriculum\cspcodes> python parse.py --option 20 30 30
[20, 30, 30]
PS D:\curriculum\cspcodes> python parse.py --option 20 30
usage: use the parser [-h] [--option OPTION OPTION OPTION]
use the parser: error: argument --option: expected 3 arguments
PS D:\curriculum\cspcodes> python parse.py --option 20 30 30 40
usage: use the parser [-h] [--option OPTION OPTION OPTION]
use the parser: error: unrecognized arguments: 40
可以看到,只能输入3个数字。
- nargs = '?'
parser = argparse.ArgumentParser("use the parser")
parser.add_argument('--option', help="this is option", type=int, nargs='?', default=10)
args = parser.parse_args()
print(args.option)
对于可选参数来说,设置了nargs = '?'
,如果传入了一个值,那么就是该参数。
如果没有传入,那么就是default
值:
PS D:\curriculum\cspcodes> python parse.py
10
如果是下面这样,参数是None
。
PS D:\curriculum\cspcodes> python parse.py --option
None
这种情况如果不加nargs
,会报错。如果我们设置了const
,那么就不是None
,而是const
。见下方:
parser.add_argument('--option', help="this is option", type=int, nargs='?', default=10, const=5)
PS D:\curriculum\cspcodes> python parse.py --option
5
- nargs = ‘+’ nargs=’*'
这两个差不多,会把传入的值组织成list
parser = argparse.ArgumentParser("use the parser")
parser.add_argument('--option', help="this is option", type=int, nargs='*', default=10)
args = parser.parse_args()
print(args.option)
PS D:\curriculum\cspcodes> python parse.py --option 1 2 35
[1, 2, 35]
两者的区别在于:
parser.add_argument('--option', help="this is option", type=int, nargs='*', default=10)
PS D:\curriculum\cspcodes> python parse.py --option
[]
parser.add_argument('--option', help="this is option", type=int, nargs='+', default=10)
PS D:\curriculum\cspcodes> python parse.py --option
usage: use the parser [-h] [--option OPTION [OPTION ...]]
use the parser: error: argument --option: expected at least one argument
5. required
如果required=true
,那么可选参数就必须指定值。
parser = argparse.ArgumentParser("use the parser")
parser.add_argument('--option', help="this is option", type=int, default=10, required=True)
args = parser.parse_args()
print(args.option)
PS D:\curriculum\cspcodes> python parse.py
usage: use the parser [-h] --option OPTION
use the parser: error: the following arguments are required: --option
6. action
可以参考官方文档,感觉不太能用得到。