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文件夹与文件的操作实现代码
Jul 13 Python
用Python的Tornado框架结合memcached页面改善博客性能
Apr 24 Python
python通过Windows下远程控制Linux系统
Jun 20 Python
python实现大转盘抽奖效果
Jan 22 Python
20行python代码的入门级小游戏的详解
May 05 Python
python Django中models进行模糊查询的示例
Jul 18 Python
Django的用户模块与权限系统的示例代码
Jul 24 Python
Python利用for循环打印星号三角形的案例
Apr 12 Python
Python实现SMTP邮件发送
Jun 16 Python
Python3获取cookie常用三种方案
Oct 05 Python
Pandas||过滤缺失数据||pd.dropna()函数的用法说明
May 14 Python
端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!
Jun 11 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性能优化准备篇图解PEAR安装
2011/12/05 PHP
php中的观察者模式简单实例
2015/01/20 PHP
Laravel 实现数据软删除功能
2019/08/21 PHP
jQuery的三种$()
2009/12/30 Javascript
关于js类的定义
2011/06/28 Javascript
JavaScript实现页面滚动图片加载(仿lazyload效果)
2011/07/22 Javascript
Javascript 类、命名空间、代码组织代码
2011/07/31 Javascript
ie中js创建checkbox默认选中问题探讨
2013/10/21 Javascript
通过Javascript读取本地Excel文件内容的代码示例
2014/04/08 Javascript
js怎么覆盖原有方法实现重写
2014/09/04 Javascript
功能强大的Bootstrap组件(结合js)
2016/08/03 Javascript
在js代码拼接dom对象到页面上去的模板总结(必看)
2017/02/14 Javascript
详解搭建es6+devServer简单开发环境
2018/09/25 Javascript
Vux+Axios拦截器增加loading的问题及实现方法
2018/11/08 Javascript
详解用Webpack与Babel配置ES6开发环境
2019/03/12 Javascript
Vue CL3 配置路径别名详解
2019/05/30 Javascript
通过实例解析js简易模块加载器
2019/06/17 Javascript
vue filter 完美时间日期格式的代码
2019/08/14 Javascript
vue设置导航栏、侧边栏为公共页面的例子
2019/11/01 Javascript
[03:11]2014DOTA2国际邀请赛-VG掉入败者组 独家专访357
2014/07/19 DOTA
python选择排序算法的实现代码
2013/11/21 Python
python一键升级所有pip package的方法
2017/01/16 Python
Python 实现王者荣耀中的敏感词过滤示例
2019/01/21 Python
python实现超级玛丽游戏
2020/03/18 Python
Python脚本实现监听服务器的思路代码详解
2020/05/28 Python
Python 无限级分类树状结构生成算法的实现
2021/01/21 Python
pycharm最新激活码有效期至2100年(亲测可用)
2021/02/05 Python
JAVA高级程序员面试题
2013/09/06 面试题
副总经理岗位职责
2014/03/16 职场文书
青年文明号服务承诺
2014/03/31 职场文书
初中学生评语大全
2014/04/24 职场文书
信用社主任竞聘演讲稿
2014/05/23 职场文书
班级标语大全
2014/06/21 职场文书
如何书写邀请函?
2019/06/24 职场文书
HAM-2000摩机图
2021/04/22 无线电
OpenCV-Python直方图均衡化实现图像去雾
2021/06/07 Python