python入门:argparse浅析 nargs='+'作用


Posted in Python onJuly 12, 2020

我就废话不多说了,大家还是直接看代码吧~

#aaa.py
#version 3.5
import os #这句是没用了,不知道为什么markdown在编辑代码时,不加这一句,就不能显示代码高亮[汗]
import argparse

parser = argparse.ArgumentParser(description='Process some integers...') #初始化一个分析器
#parser.add_argument(中的参数)
#__init__(self, option_strings, dest, nargs=None, const=None, default=None, type=None, choices=None, required=False, help=None, metavar=None)
parser.add_argument('integers',metavar='N',type=int,nargs='+',
   help='an integer for the accumulator') 
   #这是一个添加【位置参数】
   #第一个参数是自定义的参数名,在代码中用来计算的(parser.parse_args().integers*2)
 
parser.add_argument('--sum',dest='accumulate',action='store_const',
   const=sum,default=max,
   help='sum the integers(default:find the max)')
   #这是一个添加【可选参数】
   #第一个参数是自定义的参数【在代码中的使用parser.parse_args().sum】【在系统命令行中的使用:>python aaa.py --sum
 
args = parser.parse_args()
print(args)  #Namespace(accumulate=<built-in function sum>, integers2=[1, 2, 3, 4])
print(args.integers) #integers要与上面的对应
print(args.accumulate(args.integers)) #accumulate要与上面的对应
import argparse
def infer(args):
 for img in args.imgs:
 print("\n=== {} ===".format(img))
if __name__ == '__main__':
 parser = argparse.ArgumentParser()
 parser.add_argument('--imgs',type=str,nargs='+')
 args = parser.parse_args()
 infer(args)

结果

python入门:argparse浅析 nargs='+'作用

补充知识:argparse解析命令行参数

argparse简介:

在argparse中,最常用的就是上述三部分了:创建一个ArgumentParser对象;使用add_argument()方法来为创建的ArgumentParser对象添加argument的解析规则;最后调用parse_args()来解析传入的内容,依据的是第二步制定的规则,生成的是一个Namespace对象,若未传参数给parse_args(),那么默认从sys.argv来获取命令行入参。

创建一个ArgumentParser:

函数原型为:

ArgumentParser(prog=None,usage=None,description=None,epilog=None, parents=[],formatter_class=argparse.HelpFormatter, prefix_chars='-', fromfile_prefix_chars=None, argument_default=None,conflict_handler='error', add_help=True)

1、prog:程序的名字,默认是argv[0]。若设置,则在帮助信息中,可以使用%(prog)s来作为格式化的引用(修改一处全局受用)。

2、usage:帮助信息的usage字段,描述程序的各种用法,默认情况下会依据add_argument()来自动生成。

3、description:一个简单描述程序主要干啥以及怎么用的字符段,默认为空。

4、epilog:optional arguments字符段之后的字符段,默认为空。

5、parents:继承的父parser,为了避免一些公共的内容重复定义,父parser在初始化时会设置add_help=False,这是为了防止出现父与子parser的-h冲突而抛出异常。

6、formatter_class:对于help输出进行格式化,除了输出的样式外,如果设置为ArgumentDefaultsHelpFormatter,则会自动在help输出中添加已定义的default值。

7、prefix_chars:options前的字符,默认为'-',可以添加其他字符,如'-+',但是如果没有包括'-',那么对应的option如'-h'就无法解析。

8、fromfile_prefix_chars:有时会使用文件给parse_args()传入参数,为了能够识别文件字符串,如"demo.txt",需要设置此值,如"@",那么所有以此字符为开头的字符串都被当作是文件,所以传给parse_args()的参数应该是@demo.txt。在该文件中,一行只能有一个参数。如文件中的'-f\nbar'会被解析成['-f','bar']。

9、argument_default:一般情况下,默认值使用add_argument()来添加,或者使用set_defaults()设置一些键值对来添加。剩下一种情况就是设置此项(此处没看明白是咋回事)。

10、conflict_handler:解决在add_argument()阶段有冲突的option的依据策略,默认为error即抛出异常。一般情况下遇到冲突是抛出异常即可,但是如果设置了parents,那么需要重写父parser中的规则的时候,就需要将此项设置为resolve,但是重写是精确匹配的,如老规则定义了-h/--help,重写了-h,那么--help还是老规则。

11、add_help:是否添加-h/--helpoption,默认为True。为False时,是要做parent(其实可以设置子Parser重写)。默认是-h/--help,若prefix_chars中没有包含'-',那么就以其中第一个字符作为代替。

调用add_argument()添加解析规则:

函数原型:

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

1、name or flags:是位置参数,则需要传入名字;要是可选参数,则需要进行定义,如'-f','--foo'。

2、action:定义传入的参数如何处理。

action='store',默认取值,保存传入参数。

action='store_const',需要添加const,意味着该argument的值不从命令行输入,而是取const的值。

action='store_true' or action='store_false','store_const'的特殊情形,意味着const的值为True或False。

action='append',表示传入的值会作为一个列表的一项,意味着option可以在命令行中多次出现。

action='append_const',传入列表的项由const定义,通常用在需要多个argument将值传入一个列表中的场景。

action='count',输出argument出现的次数。

action='help',已默认添加。

action='version',需要定义version,使用时输出版本信息并退出。

自定义,通过定义一个argparse.Action子类来实现。实际上,上面的这些可选项都是通过这种形式定义的。

3、nargs:ArgumentParser对象通常将一个动作与一个命令行参数关联。nargs关键字参数将一个动作与不同数目的命令行参数关联在一起:

nargs=N,一个选项后可以跟多个参数(action='append'时,依然是一个选项后跟一个参数,只不过选项可以多次出现),参数的个数必须为N的值,这些参数会生成一个列表,当nargs=1时,会生成一个长度为1的列表。

nargs=?,如果没有在命令行中出现对应的项,则给对应的项赋值为default。特殊的是,对于可选项,如果命令行中出现了此可选项,但是之后没有跟随赋值参数,则此时给此可选项并不是赋值default的值,而是赋值const的值。

nargs=*,和N类似,但是没有规定列表长度。

nargs=+,和*类似,但是给对应的项当没有传入参数时,会报错error: too few arguments。

nargs=argparse.REMAINDER,所有剩余的参数,均转化为一个列表赋值给此项,通常用此方法来将剩余的参数传入另一个parser进行解析。如果nargs没有定义,则可传入参数的数量由action决定,通常情况下为一个,并且不会生成长度为一的列表。

4、const,一种是定义action='store_const'或action='append_const'时使用。一种是定义nargs='?'时,可选项出现在命令行中,但之后并没有跟随赋值的参数,作为默认值传给此可选项。

5、default:默认值。

如果是一个字符串,那么Parser解析的时候会将它作为命令行传入值,使用type的值来进行转换类型,但是如果不是的话,就会使用定义的值而不进行类型转换。如果设置了nargs='?'或nargs='*',那么当没有参数赋值给该项时,会使用default定义的值。

而default=argparse.SUPPRESS时,则表示命令行中未出现某一项时,不会对它进行默认赋值。

6、type:用于类型检查和类型转换。

使用FileType可简化对文件的操作。还可以自定义函数,输入是一个字符串,输出是转换后的字符串。当设置choices的时,类型检查会变得容易,因为只需要在一个范围内比较即可。

7、choices:给定了取值范围,超出会报错。

当type也有定义时,会先使用type进行类型检查,所以choices中的取值必须符合type的定义,否则在parse_args()时会报错。任何支持in操作符的均可作为choices的赋值,所以字典,列表,集合,等等其他容器均都支持。

8、required:默认情况下,可选项(前面有'-')被认为并不一定需要出现在命令行参数中,但是如果设置了required=True的话,则必须出现。此类设置违背人的常识,应避免使用。

9、help:帮助信息。

之前提到的%(prog)s可用于此处程序名的格式化,此外,还有%(default)s格式化default的值,%(type)s格式化type的值。

设置为argparse.SUPPRESS可不显示帮助信息。

10、metavar:在Parser生成帮助信息时,需要有字符代表需要传入的值。(这一段和dest相同,使用的就是dest的值)如果是位置参数,则用它本身代替;如果是可选参数,则使用它的大写来代替。使用metavar可替换默认的字符。

11、dest:大部分的选项都需要通过命令行来给其赋值,这些值的名字通过dest来定义,默认的规则如同metavar中所述。

调用parse_args()解析

函数原型:

ArgumentParser.parse_args(args=None, namespace=None)

将args转换为namespace对象的一个值。默认情况下,sys.argv赋值给args,一个空的Namespace对象会被创建。解析时,会对传入的参数进行检查,若不符合要求就会报错。一般情况下,会自动判断传入的值到底是一个可选参数,还是一个负数(都用'-'开头)。但有时位置参数的值必须是一个'-'开头的值,如'-f',那么使用parser.parse_args(['--', '-f']),'--'代表后续的所有传入值都需要看做是位置参数。parse_args()会返回填充好的Namespace对象

实例:

以faster rcnn代码中的命令行解析为例:

#coding=utf-8
import argparse
import sys
 
def parse_args():
 parser = argparse.ArgumentParser(description='Train a Fast R-CNN network')
 parser.add_argument('--cfg', dest='cfg_file',help='optional config file',default=None, type=str)
 parser.add_argument('--weight', dest='weight',help='initialize with pretrained model weights',type=str)
 parser.add_argument('--imdb', dest='imdb_name',help='dataset to train on',default='voc_2007_trainval', type=str)
 parser.add_argument('--imdbval', dest='imdbval_name',help='dataset to validate on',default='voc_2007_test', type=str)
 parser.add_argument('--iters', dest='max_iters',help='number of iterations to train',default=70000, type=int)
 parser.add_argument('--tag', dest='tag',help='tag of the model',default=None, type=str)
 parser.add_argument('--net', dest='net',help='vgg16, res50, res101, res152, mobile',default='res50', type=str)
 parser.add_argument('--set', dest='set_cfgs',help='set config keys', default=None,nargs=argparse.REMAINDER)
 
 if len(sys.argv) == 1:
 parser.print_help()
 sys.exit(1)
 args = parser.parse_args()
 return args
 
if __name__ == '__main__':
 args = parse_args()
 print(args)

将以上代码保存为test.py,然后在命令行输入:python test.py

结果为:

usage: test.py [-h] [--cfg CFG_FILE] [--weight WEIGHT] [--imdb IMDB_NAME]
  [--imdbval IMDBVAL_NAME] [--iters MAX_ITERS] [--tag TAG]
  [--net NET] [--set ...]

Train a Fast R-CNN network

optional arguments:
 -h, --help  show this help message and exit
 --cfg CFG_FILE optional config file
 --weight WEIGHT initialize with pretrained model weights
 --imdb IMDB_NAME dataset to train on
 --imdbval IMDBVAL_NAME
   dataset to validate on
 --iters MAX_ITERS number of iterations to train
 --tag TAG  tag of the model
 --net NET  vgg16, res50, res101, res152, mobile
 --set ...  set config keys

在命令行输入:

python test.py --weight data/imagenet_weights/vgg16.ckpt \
 --imdb voc_2007_trainval \
 --imdbval voc_2007_test \
 --iters 7000 \
 --cfg experiments/cfgs/vgg16.yml \
 --net vgg16  \
 --set ANCHOR_SCALES "[8,16,32]" ANCHOR_RATIOS "[0.5,1,2]" TRAIN.STEPSIZE "[50000]"

结果为:

Namespace(cfg_file='experiments/cfgs/vgg16.yml',imdb_name='voc_2007_trainval',imdbval_name='voc_2007_test', max_iters=7000, net='vgg16', set_cfgs=['ANCHOR_SCALES', '[8,16,32]', 'ANCHOR_RATIOS', '[0.5,1,2]', 'TRAIN.STEPSIZE', '[50000]'], tag=None, weight='data/imagenet_weights/vgg16.ckpt')

以上这篇python入门:argparse浅析 nargs='+'作用就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现对象转换为xml的方法示例
Jun 08 Python
对PyTorch torch.stack的实例讲解
Jul 30 Python
numpy 对矩阵中Nan的处理:采用平均值的方法
Oct 30 Python
python批量从es取数据的方法(文档数超过10000)
Dec 27 Python
python itchat实现调用微信接口的第三方模块方法
Jun 11 Python
利用python实现短信和电话提醒功能的例子
Aug 08 Python
Django框架表单操作实例分析
Nov 04 Python
pytorch 指定gpu训练与多gpu并行训练示例
Dec 31 Python
基于Pycharm加载多个项目过程图解
Jan 19 Python
pycharm 实现本地写代码,服务器运行的操作
Jun 08 Python
Django mysqlclient安装和使用详解
Sep 17 Python
基于python模拟bfs和dfs代码实例
Nov 19 Python
浅谈Python 命令行参数argparse写入图片路径操作
Jul 12 #Python
Python实现封装打包自己写的代码,被python import
Jul 12 #Python
Django封装交互接口代码
Jul 12 #Python
在django中实现choices字段获取对应字段值
Jul 12 #Python
利用python对mysql表做全局模糊搜索并分页实例
Jul 12 #Python
django美化后台django-suit的安装配置操作
Jul 12 #Python
浅谈matplotlib 绘制梯度下降求解过程
Jul 12 #Python
You might like
PHP Ajax中文乱码问题解决方法
2009/02/27 PHP
php准确获取文件MIME类型的方法
2015/06/17 PHP
PHP编程之设置apache虚拟目录
2016/07/08 PHP
TP5(thinkPHP5框架)基于bootstrap实现的单图上传插件用法示例
2019/05/29 PHP
使Ext的Template可以解析二层的json数据的方法
2007/12/22 Javascript
解读IE和firefox下JScript和HREF的执行顺序
2008/01/12 Javascript
jQuery getJSON 处理json数据的代码
2010/07/26 Javascript
33个优秀的jQuery 教程分享(幻灯片、动画菜单)
2011/07/08 Javascript
JavaScript调用客户端的可执行文件(示例代码)
2013/11/28 Javascript
Angular.JS中的指令引用template与指令当做属性详解
2017/03/30 Javascript
three.js实现3D视野缩放效果
2017/11/16 Javascript
js遍历添加栏目类添加css 再点击其它删除css【推荐】
2018/06/12 Javascript
基于javascript实现贪吃蛇小游戏
2019/11/25 Javascript
vue.js中使用微信扫一扫解决invalid signature问题(完美解决)
2020/04/11 Javascript
javascript 代码是如何被压缩的示例代码
2020/05/06 Javascript
js根据后缀判断文件文件类型的代码
2020/05/09 Javascript
如何利用javascript接收json信息并进行处理
2020/08/06 Javascript
[59:30]完美世界DOTA2联赛PWL S3 access vs LBZS 第二场 12.20
2020/12/23 DOTA
python实现apahce网站日志分析示例
2014/04/02 Python
在Python中关于中文编码问题的处理建议
2015/04/08 Python
关于Python中异常(Exception)的汇总
2017/01/18 Python
python 构造三维全零数组的方法
2018/11/12 Python
Django数据库连接丢失问题的解决方法
2018/12/29 Python
Python二元赋值实用技巧解析
2019/10/25 Python
用python写爬虫简单吗
2020/07/28 Python
如何在scrapy中捕获并处理各种异常
2020/09/28 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
2021/02/25 Python
IdealFit官方网站:女性蛋白质、补充剂和运动服装
2019/03/24 全球购物
夜大毕业生自我鉴定
2013/10/31 职场文书
暑期社会实践方案
2014/02/05 职场文书
《老王》教学反思
2014/02/23 职场文书
个人违纪检讨书
2014/09/15 职场文书
tensorflow学习笔记之tfrecord文件的生成与读取
2021/03/31 Python
React 高阶组件HOC用法归纳
2021/06/13 Javascript
铁拳制作人赞《铁拳7》老头环Mod:制作精良 但别弄了
2022/04/03 其他游戏
CentOS7安装MySQL8的超级详细教程(无坑!)
2022/06/10 Servers