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中使用OpenCV进行人脸检测的例子
Apr 18 Python
Python中用于转换字母为小写的lower()方法使用简介
May 19 Python
python 读取鼠标点击坐标的实例
Dec 29 Python
Python3.5集合及其常见运算实例详解
May 01 Python
django之使用celery-把耗时程序放到celery里面执行的方法
Jul 12 Python
详解Django admin高级用法
Nov 06 Python
在OpenCV里使用Camshift算法的实现
Nov 22 Python
Python tcp传输代码实例解析
Mar 18 Python
matplotlib 画双轴子图无法显示x轴的解决方法
Jul 27 Python
mac系统下安装pycharm、永久激活、中文汉化详细教程
Nov 24 Python
numpy数据类型dtype转换实现
Apr 24 Python
python办公自动化之excel的操作
May 23 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与javascript对多项选择的处理
2006/10/09 PHP
PHP调用JAVA的WebService简单实例
2014/03/11 PHP
WordPress中缩略图的使用以及相关技巧
2015/11/24 PHP
PHP入门教程之操作符与控制结构流程详解
2016/09/09 PHP
Javascript实例教程(19) 使用HoTMetal(1)
2006/12/23 Javascript
javascript实现tabs选项卡切换效果(自写原生js)
2013/03/19 Javascript
jquery+easeing实现仿flash的载入动画
2015/03/10 Javascript
Jquery使用val方法读写value值
2015/05/18 Javascript
window.onload与$(document).ready()的区别分析
2015/05/30 Javascript
jQuery实现的漂亮表单效果代码
2015/08/18 Javascript
js实现文本框支持加减运算的方法
2015/08/19 Javascript
【经验总结】编写JavaScript代码时应遵循的14条规律
2016/06/20 Javascript
JavaScript6 let 新语法优势介绍
2016/07/15 Javascript
DOM中事件处理概览与原理的全面解析
2016/08/16 Javascript
js实现抽奖效果
2017/03/27 Javascript
使用jQuery.Pin垂直滚动时固定导航
2017/05/24 jQuery
JavaScript实现的数字与字符串转换功能示例
2017/08/23 Javascript
详解ES6中的代理模式——Proxy
2018/01/08 Javascript
k8s node节点重新加入master集群的实现
2021/02/22 Javascript
Python 自动补全(vim)
2014/11/30 Python
Python实现的括号匹配判断功能示例
2018/08/25 Python
Python 面试中 8 个必考问题
2018/11/16 Python
Python线程池模块ThreadPoolExecutor用法分析
2018/12/28 Python
解决django 新增加用户信息出现错误的问题
2019/07/28 Python
python pygame实现滚动横版射击游戏城市之战
2019/11/25 Python
Python中Selenium库使用教程详解
2020/07/23 Python
Python压缩模块zipfile实现原理及用法解析
2020/08/14 Python
幼师岗位求职简历的自荐信格式
2013/09/21 职场文书
临床医师个人自我评价
2014/04/06 职场文书
我的画教学反思
2014/04/28 职场文书
2014年局领导班子自身建设情况汇报
2014/11/21 职场文书
Springboot如何使用logback实现多环境配置?
2021/06/16 Java/Android
浅谈Redis跟MySQL的双写问题解决方案
2022/02/24 Redis
Python下载商品数据并连接数据库且保存数据
2022/03/31 Python
python微信智能AI机器人实现多种支付方式
2022/04/12 Python
Java对文件的读写操作方法
2022/04/29 Java/Android