argparse命令行参数与参数解析


备注:t.py为所运行代码的文件名
   终端中的路径与t.py文件所在路径保持一致

    dest属性名称不要出现符号’-‘,例如:dest:‘best-model’,可用符号’_'也即,‘best_model’

一、命令行与参数解析工具的作用?

  (1) 在Linux操作系统中,总离不开用命令行执行相关代码,因此使用命令行与参数解析工具封装相关参数是十分有必要的。
  (2) 可以十分便捷的生成帮助文档,以通俗的解释相关参数类型和运行方式。
  (3) 方便管理深度学习的相关参数,且较多与深度学习有关的源码均采用命令行与参数解析工具管理深度学习参数。
  (4) 较多与深度学习相关的开源代码,选择使用argparse来封装模型的超参数。

二、argparse命令行与参数解析工具

 2.1 argparse使用步骤

  (1) 创建解析器对象
  (2) 添加参数
  (3) 解析参数
  具体示例如下所示:

## 示例一
import argparse
# 创建解析器对象
parser = argparse.ArgumentParser(description='test argparse')
# 向创建的解析器对象中添加参数
parser.add_argument('-b', '--batch_size', dest='batch_size', type=int, default=16, help='the batch_size in training')
parser.add_argument('-l', '--learning_rate', dest='lr', type=float, default=0.001, help='the learning rate in training')
# 参数解析
args = parser.parse_args()
# 调用参数
print(args.batch_size)
print(args.lr)
# 备注:dest表示参数的属性名称==>args.dest(batch_size)调用相应值
#       default表示默认值
#       dest属性名称不要出现符号'-',例如:dest:'best-model'
# 运行步骤:
   # (1) 将上面的代码保存为t.py
   # (2) 在终端中打开输入指令:python t.py --batch_size 32 --learning_rate 0.0001
   #     或 python t.py -b 32 -l 0.0001
   # 备注:--batch_size为长参数, -b 为短参数


## 示例二
import argparse
# 创建解析器
parser = argparse.ArgumentParser(description='Process some integers.')
# 添加参数
parser.add_argument('integers', metavar='N', type=int, nargs='+',help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const', const=sum, default=max, help='sum the integers')
# 解析参数
args = parser.parse_args()
print(args.accumulate(args.integers))
# 备注:nargs表示输入命令行参数的个数,'+'表示任意多个
#       default表示默认值
# 运行步骤:
   # (1) 将上面的代码保存为tt.py
   # (2) 在终端中打开输入指令:python t.py --sum 2 1

先从命令行中选择参数,若无再从const中选择参数,若还没有则从选择默认参数

 2.2 argparse.ArgumentParser的常用参数解释

   (1) prog–程序的名称(默认-sys.argv[0], 即保存py文件的名称)==>无特殊情况不做修改

import argparse
# 创建解析器
parser = argparse.ArgumentParser(prog='test.py', description='Process some integers.')
# 添加参数
parser.add_argument('integers', metavar='N', type=int, nargs='+',help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const', const=sum, default=max, help='sum the integers')
# 解析参数
args = parser.parse_args()
print(args.accumulate(args.integers))
# 在终端输入:python t.py -h,得到结果如下所示:
# 更改前:usage: t.py [-h] [--sum] N [N ...]  
# 更改后:usage: test.py [-h] [--sum] N [N ...]
# 注意:t.py为py文件的文件名称

   (2) usage-描述程序用途的字符串,默认由添加到解析器的参数生成-使用默认值即可。
   (3) description-参数帮助之前显示的文档
   (4) epilog-参数帮助文档之后显示的文本

import argparse
# 创建解析器
parser = argparse.ArgumentParser(prog='test.py', description='Process some integers.',  epilog='input Y(Yes)/N(No)?')
# 添加参数
parser.add_argument('integers', metavar='N', type=int, nargs='+',help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const', const=sum, default=max, help='sum the integers')
# 解析参数
args = parser.parse_args()
print(args.accumulate(args.integers))
# 在终端输入:python t.py -h,得到结果如下所示:
# usage: test.py [-h] [--sum] N [N ...]
# Process some integers.
# positional arguments:
#  N           an integer for the accumulator
# optional arguments:
#   -h, --help  show this help message and exit
#   --sum       sum the integers
# input Y(Yes)/N(No)?

   (5) parents - 一个 ArgumentParser 对象的列表,它们的参数也应包含在内

  (6) add_help - 为解析器添加一个 -h/–help 选项-默认值: True

parents - 一个 ArgumentParser 对象的列表,它们的参数也应包含在内
formatter_class - 用于自定义帮助文档输出格式的类
prefix_chars - 可选参数的前缀字符集合(默认值:’-’)
fromfile_prefix_chars - 当需要从文件中读取其他参数时,用于标识文件名的前缀字符集合> 默认值:None)
argument_default - 参数的全局默认值(默认值: None)
conflict_handler - 解决冲突选项的策略(通常是不必要的)
add_help - 为解析器添加一个 -h/–help 选项(默认值: True)
allow_abbrev - 如果缩写是无歧义的,则允许缩写长选项 (默认值:True)

 2.3 argparse.ArgumentParser.add_argument常用参数解释

  注意:(1) 每个参数都需要独立添加,若要添加两个参数则需要使用两个add_argument()
     (2) 所添加的参数分为两种:
       1) 位置参数 -positional arguments:按照参数设置的先后顺序读取读取命令行参数,不需要设置参数名,且传入的参数均为字符型。

import argparse
# 创建解析器
parser = argparse.ArgumentParser(description='Process some integers.')
# 添加参数
parser.add_argument('integers', metavar='N', type=int, nargs='+',help='some integer')
parser.add_argument('str', metavar='str', type=str, nargs='+',help='some str')
# 解析参数
args = parser.parse_args()
# metavar='N'
# nargs:表示输入命令行参数的个数,其中'+'表示任意个参数。
# 在终端中输入:python t.py,可得到如下结果:
# usage: test.py [-h] N [N ...] str [str ...]
# positional arguments:
#   N           some integer
#   str         some str

# optional arguments:
#   -h, --help  show this help message and exit

       2) 可选参数 - 位置不固定按照参数名读取数据,具体如下所示:
         (a) -b/–batch_size, 长短参数
         (b) action指定参数:‘store_true’/‘store_false’ : 存储bool值True或False; ‘store_const’ :存储const指定的常数值。

## 示例一-存储命令行输入参数
import argparse
# 创建解析器
parser = argparse.ArgumentParser(description='Process some integers.')
# 添加参数
parser.add_argument('-b', '--batch_size', dest='batch_size', type=int, default=16, help='the batch_size in training')
parser.add_argument('-l', '--learning_rate', dest='lr', type=float, default=0.001, help='the learning rate in training')
# 解析参数
args = parser.parse_args()

## 示例二-指定参数(需要用到add_argument里的action属性)
import argparse
# 创建解析器
parser = argparse.ArgumentParser(description='test the action attribute of add_argument')
# 添加参数
parser.add_argument('-b', '--bool_value', dest='bool_value', action='store_true', help='True')
parser.add_argument('-l', '--learning_rate', dest='lr', type=float, default=0.001, help='the learning rate in training')
# 解析参数
args = parser.parse_args()
if args.bool_value:
	print('学习率%f'%args.lr)
else:
	print('--bool_value has not been given!')
# 结果展示:
#	(1)终端输入:python t.py -l 0.001 -b
#          结果:学习率:0.001
#          备注:输入 -b 后解析解析时会调用action里面指定的参数:store_true/store_false

#	(2)终端输入:python t.py -l 0.001
#          结果:--bool_value has not been given!

## 示例三-指定参数(需要用到add_argument里的action属性)
import argparse
# 创建解析器
parser = argparse.ArgumentParser(description='Process some integers.')
# 添加参数
parser.add_argument('integers', metavar='N', type=int, nargs='+',help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const', const=sum, default=max, help='sum the integers')
# 解析参数
args = parser.parse_args()
print(args.accumulate(args.integers))
# 备注:nargs表示输入命令行参数的个数,'+'表示任意多个

# 结果展示:
#	(1)终端输入:python t.py --sum 3 2 1 4
#          结果:10
#          备注:输入参数名 -sum 后,解析解析时会调用const指定的参数:sum

#	(2)终端输入:python t.py 3 2 1 4
#          结果:4
#          备注:在命令行没有输入-sum,则会调用默认参数

   (3) name/flags - 命令行参数的名称,如batch_size或 -b, --batch_size。
   (4) action - 当参数在命令行中出现时使用的动作基本类型:1) ‘store_true’/‘store_false’; 2) ‘store_const’。
   (5) nargs - 命令行参数的数量:1) args=‘*’ 表示参数可设置零个或多个;2) nargs=’ ‘+’ 表示参数可设置一个或多个;3) nargs='?'表示参数可设置零个或一个。
   (6) choices - 可用的参数的容器。

import argparse
# 创建解析器对象
parser = argparse.ArgumentParser(description='test argparse')
# 向创建的解析器对象中添加参数
parser.add_argument('-b', '--batch_size', dest='batch_size', type=int, default=16, metavar='16', choices=[4, 16, 32], help='the batch_size in training')
parser.add_argument('-l', '--learning_rate', dest='lr', type=float, default=0.001, metavar='0.01', help='the learning rate in training')
# 参数解析
args = parser.parse_known_args()

# 在终端中输入:python t.py -b 5
# 结果:
# usage: t.py [-h] [-b 16] [-l 0.01]
# t.py: error: argument -b/--batch_size: invalid choice: 5 (choose from 4, 16, 32)
# 备注:因为5不在choices范围内,因此会报错。

   (7) metavar - 在help消息中显示使用的参数值示例。

import argparse
# 创建解析器对象
parser = argparse.ArgumentParser(description='test argparse')
# 向创建的解析器对象中添加参数
parser.add_argument('-b', '--batch_size', dest='batch_size', type=int, default=16, metavar='16', choices=[4, 16, 32], help='the batch_size in training')
parser.add_argument('-l', '--learning_rate', dest='lr', type=float, default=0.001, metavar='0.01', help='the learning rate in training')
# 参数解析
args = parser.parse_known_args()

# 在终端中输入:python t.py -h
# 结果:
# usage: t.py [-h] [-b 16] [-l 0.01]
# test argparse
# optional arguments:
#   -h, --help            show this help message and exit
#   -b 16, --batch_size 16
#                         the batch_size in training
#   -l 0.01, --learning_rate 0.01
#                         the learning rate in training

   (8) dest - 被添加到 parse_args() 所返回对象上的属性名。
   (9) default - 当参数未在命令行中出现时使用的值。
   (10) type - 命令行参数应当被转换成的类型。
   (11) required - 此命令行选项是否可省略 _仅选项可用。
   (12) help - 一个此选项作用的简单描述。

三、两种解析方式的区别

 3.1 parse_args()解析方式

import argparse
# 创建解析器对象
parser = argparse.ArgumentParser(description='test argparse')
# 向创建的解析器对象中添加参数
parser.add_argument('-b', '--batch_size', dest='batch_size', type=int, default=16, metavar='16',help='the batch_size in training')
parser.add_argument('-l', '--learning_rate', dest='lr', type=float, default=0.001, help='the learning rate in training')
# 参数解析
args = parser.parse_args()
print(args)
# 终端输入命令:python t.py -b 32 -l 0.001
#        结果:Namespace(batch_size=32, lr=0.001)

# 输入的命令行参数不在已添加的参数范围内则会报错,如下所示:
# 终端输入命令:python t.py -b 32 -l 0.001 -n 512
#         结果: usage: t.py [-h] [--batch_size 16] [--learning_rate LR]
#              t.py: error: unrecognized arguments: -n 512

  针对上述报错问题,可采用parse_known_args()解析方式。

 3.1 parse_known_args()解析方式

   使用parse_known_args()解析方式会返回一个元组分别用于存放已添加元素和未添加元素,如下所示:

import argparse
# 创建解析器对象
parser = argparse.ArgumentParser(description='test argparse')
# 向创建的解析器对象中添加参数
parser.add_argument('-b', '--batch_size', dest='batch_size', type=int, default=16, metavar='16',help='the batch_size in training')
parser.add_argument('-l', '--learning_rate', dest='lr', type=float, default=0.001, help='the learning rate in training')
# 参数解析
args = parser.parse_known_args()
print(args)
# print(args[0])
# print(args[1])
# 终端输入命令:python t.py -b 32 -l 0.001
#        结果:(Namespace(batch_size=32, lr=0.001), [])

# 输入的命令行参数不在已添加的参数范围内不会报错,如下所示:
# 终端输入命令:python t.py -b 32 -l 0.001 -n 512
#         结果: (Namespace(batch_size=16, lr=0.001), ['-n', '512'])
#         备注:未添加元素以空格作为分隔符,且以字符串的形式被添加至列表中

四、参考链接

  1、ArgumentParser相关属性介绍
  2、add_argument
  3、metavar参数的作用
  4、两种参数解析方式的比较
  5、python 命令行参数 argparse用法总结
  6、python argparese命令行参数

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值