我们在写python脚本的时候,有时候需要在运行的时候传入参数,而不是写死在程序里,这个时候就要用到argparse模块。
argparse 模块是 Python 内置的用于命令项选项与参数解析的模块,argparse 模块可以让人轻松编写用户友好的命令行接口,能够帮助程序员为模型定义参数。
使用步骤
我们常常可以把argparse的使用简化成下面四个步骤
-
import argparse
-
parser = argparse.ArgumentParser()
-
parser.add_argument()
-
parser.parse_args()
上面四个步骤解释如下:首先导入该模块;然后创建一个解析对象;然后向该对象中添加你要关注的命令行参数和选项,每一个add_argument方法对应一个你要关注的参数或选项;最后调用parse_args()方法进行解析;解析成功之后即可使用。
例子:
# 导入库
import argparse
# 1. 定义命令行解析器对象
parser = argparse.ArgumentParser(description='Demo of argparse')
# 2. 添加命令行参数
parser.add_argument('--epochs', type=int, default=30)
parser.add_argument('--batch', type=int, default=4)
# 3. 从命令行中结构化解析参数
args = parser.parse_args()
print(args) # Namespace(batch=4, epochs=30)
epochs = args.epochs
batch = args.batch
print('show {} {}'.format(epochs, batch)) # show 30 4
代码解读:首先我们导入argparse这个包,然后包中的ArgumentParser类生成一个parser对象(其中的description对参数解析器的作用进行描述),当我们在命令行显示帮助信息的时候会看到description描述的信息。
运行结果:
Namespace(batch=4, epochs=30)
show 30 4
参数详解
1.argparse.ArgumentParser()方法
2.add_argument() 方法
(1)add_argument() 方法参数快速解释
add_argument() 方法定义如何解析命令行参数:
ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
每个参数解释如下:
name or flags - 选项字符串的名字或者列表,例如 foo 或者 -f, --foo。
action - 命令行遇到参数时的动作,默认值是 store。
store_const,表示赋值为const;
append,将遇到的值存储成列表,也就是如果参数重复则会保存多个值;
append_const,将参数规范中定义的一个值保存到一个列表;
count,存储遇到的次数;此外,也可以继承 argparse.Action 自定义参数解析;
nargs - 应该读取的命令行参数个数,可以是具体的数字,或者是?号,当不指定值时对于 Positional argument 使用 default,对于 Optional argument 使用 const;或者是 * 号,表示 0 或多个参数;或者是 + 号表示 1 或多个参数。
const - action 和 nargs 所需要的常量值。
default - 不指定参数时的默认值。
type - 命令行参数应该被转换成的类型。
choices - 参数可允许的值的一个容器。
required - 可选参数是否可以省略 (仅针对可选参数)。
help - 参数的帮助信息,当指定为 argparse.SUPPRESS 时表示不显示该参数的帮助信息.
metavar - 在 usage 说明中的参数名称,对于必选参数默认就是参数名称,对于可选参数默认是全大写的参数名称.
dest - 解析后的参数名称,默认情况下,对于可选参数选取最长的名称,中划线转换为下划线.
(2)add_argument() 方法参数详细解释
给一个 ArgumentParser 添加程序参数信息,是通过调用 add_argument() 方法完成的。通常,这些调用指定 ArgumentParser 如何获取命令行字符串并将其转换为对象。这些信息在 parse_args() 调用时被存储在ArgumentParser实例化对象中,以供后续使用。add_argument() 方法定义如何解析命令行参数的呢?
parser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][,choices][, required][, help][, metavar][, dest])
每个参数解释如下:
-
name or flags: 普通参数或flag参数选项参数的名称或标签,例如 epochs 或者 -e, --epochs。Flag参数不需要指定参数值,只需要带有参数名即可。
-
action: 命令行遇到flags参数时的动作。有两个常见的动作,store_true:设定flag参数为true;store_false:设定flag参数为False。注意:如果直接运行程序,默认不读取该变量,要使用必须要进行传参,例如:python try.py --epochs
-
nargs: 设置参数在使用可以提供的个数,可以是具体的数字,或者是?号,当不指定值时对于 Positional argument 使用 default,对于 Optional argument 使用 const;或者是 * 号,表示 0 或多个参数;或者是 + 号表示 1 或多个参数。
parser.add_argument('-name', nargs=x)
其中x
的候选值和含义如下:
值 | 含义 |
---|---|
N | 参数的绝对个数(例如:3) |
‘?’ | 0或1个参数 |
‘’*’ | 0或所有参数 |
‘+’ | 所有,并且至少一个参数 |
如:
# file-name: nargs.py
import argparse
def get_parser():
parser = argparse.ArgumentParser(
description='nargs demo')
parser.add_argument('-name', required=True, nargs='+')
return parser
if __name__ == '__main__':
parser = get_parser()
args = parser.parse_args()
names = ', '.join(args.name)
print('Hello to {}'.format(names))
执行命令和结果如下:
$ python nargs.py -name A B C
Hello to A, B, C
-
default: 不指定参数时该参数的默认值。default表示命令行没有设置该参数的时候,程序中用什么值来代替。
-
type: 命令行参数应该被转换成的数据类型。默认的参数类型是str类型,如果你的程序需要一个整数或者布尔型参数,你需要设置
type=int
或type=bool
。
如:
#name: square.py
import argparse
def get_parser():
parser = argparse.ArgumentParser(
description='Calculate square of a given number')
parser.add_argument('-number', type=int)
return parser
if __name__ == '__main__':
parser = get_parser()
args = parser.parse_args()
res = args.number ** 2
print('square of {} is {}'.format(args.number, res))
运行结果:
$ python square.py -number 5
square of 5 is 25
- required: 是否为必选参数或可选参数。如果设置了
required=True
,则在实际运行的时候不设置该参数将报错。
...
parser.add_argument('-name', required=True)
...
运行下面的命令会报错:
$ python print_name.py
usage: print_name.py [-h] --name NAME
print_name.py: error: argument --name is required
- help: 指定参数的帮助信息。
在现实帮助信息的时候,help参数的值可以给使用工具的人提供该参数是用来设置什么的说明,对于大型的项目,help参数和很有必要的,不然使用者不太明白每个参数的含义,增大了使用难度。
如:
# file-name: help.py
import argparse
def get_parser():
parser = argparse.ArgumentParser(
description='help demo')
parser.add_argument('-arch', required=True, choices=['alexnet', 'vgg'],
help='the architecture of CNN, at this time we only support alexnet and vgg.')
return parser
if __name__ == '__main__':
parser = get_parser()
args = parser.parse_args()
print('the arch of CNN is '.format(args.arch))
在命令行加-h
或--help
参数运行该命令,获取帮助信息的时候,结果如下:
$ python help.py -h
usage: help.py [-h] -arch {alexnet,vgg}
choices demo
optional arguments:
-h, --help show this help message and exit
-arch {alexnet,vgg} the architecture of CNN, at this time we only support
alexnet and vgg.
-
metavar: 在 usage 说明中的参数名称,对于必选参数,默认就是参数名称,对于可选参数默认是全大写的参数名称。
-
dest: 解析后的参数名称,也就是设置参数在代码中的变量名。默认情况下,对于可选参数选取最长的名称,中划线转换为下划线,也就是
--
或-
后面的字符串。但是你也可以通过dest=xxx
来设置参数的变量名,然后在代码中用args.xxx
来获取参数的值。 -
choices: 参数可允许的值的一个容器。
如:
# file-name: choices.py
import argparse
def get_parser():
parser = argparse.ArgumentParser(
description='choices demo')
parser.add_argument('-arch', required=True, choices=['alexnet', 'vgg'])
return parser
if __name__ == '__main__':
parser = get_parser()
args = parser.parse_args()
print('the arch of CNN is '.format(args.arch))
如下执行会报错:
$ python choices.py -arch resnet
usage: choices.py [-h] -arch {alexnet,vgg}
choices.py: error: argument -arch: invalid choice: 'resnet' (choose from 'alexnet', 'vgg')
因为我们所给的-arch
参数resnet
不在备选的choices
之中,所以会报错。
-
const: action 和 nargs 所需要的常量值。
-
store_const:表示赋值为const;
-
append:将遇到的值存储成列表,也就是如果参数重复则会保存多个值;
-
append_const:将参数规范中定义的一个值保存到一个列表;
-
count:存储遇到的次数;此外,也可以继承 argparse.Action 自定义参数解析;
3.解析命令行的参数:parse_args()
ArgumentParser对象通过 parse_args() 方法解析命令行的参数。它将检查命令行中每个参数,转换为适当的数据类型,然后调用相应的操作,并把参数结构化后存放在对象args中。
args = parser.parse_args()
在脚本中,通常 parse_args() 会被不带参数调用,而 ArgumentParser 将自动从 sys.argv 中确定命令行参数。
标签:argparse,args,name,Python,parser,argument,参数,import From: https://www.cnblogs.com/zhangxuegold/p/17155426.html