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使用scrapy采集数据过程中放回下载过大页面的方法
Apr 08 Python
Python中的模块和包概念介绍
Apr 13 Python
合并百度影音的离线数据( with python 2.3)
Aug 04 Python
python 通过logging写入日志到文件和控制台的实例
Apr 28 Python
解决python 自动安装缺少模块的问题
Oct 22 Python
Python中三元表达式的几种写法介绍
Mar 04 Python
Pytorch卷积层手动初始化权值的实例
Aug 17 Python
基于pandas中expand的作用详解
Dec 17 Python
py-charm延长试用期限实例
Dec 22 Python
如何使用Django Admin管理后台导入CSV
Nov 06 Python
python 用struct模块解决黏包问题
Nov 07 Python
python实现猜拳游戏项目
Nov 30 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
使用PHPMyAdmin修复论坛数据库的图文方法
2012/01/09 PHP
php 获取SWF动画截图示例代码
2014/02/10 PHP
PHP实现文件上传操作和封装
2020/03/04 PHP
css动画效果之animation的常用样式
2021/03/09 HTML / CSS
Jquey拖拽控件Draggable使用方法(asp.net环境)
2010/09/28 Javascript
整理一些JavaScript的IE和火狐的兼容性注意事项
2011/03/17 Javascript
基于jquery的DIV随滚动条滚动而滚动的代码
2012/07/20 Javascript
JavaScript实现页面实时显示当前时间的简单实例
2013/07/20 Javascript
jquery 隐藏与显示tr标签示例代码
2014/06/06 Javascript
jQuery中on()方法用法实例
2015/01/19 Javascript
JavaScript实现鼠标点击后层展开效果的方法
2015/05/13 Javascript
JS封装的自动创建表格的实现代码
2016/06/15 Javascript
DIV+CSS+jQ实现省市联动可扩展
2016/06/22 Javascript
完美解决jQuery 鼠标快速滑过后,会执行多次滑出的问题
2016/12/08 Javascript
微信小程序中button组件的边框设置的实例详解
2017/09/27 Javascript
基于原生JS封装的Modal对话框插件的示例代码
2020/09/09 Javascript
JS实现京东商品分类侧边栏
2020/12/11 Javascript
[00:02]DOTA2新版本使用PA至宝后暴击展示
2014/11/19 DOTA
[55:56]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.22
2019/09/05 DOTA
python实现排序算法
2014/02/14 Python
Python解析xml中dom元素的方法
2015/03/12 Python
python算法表示概念扫盲教程
2017/04/13 Python
python3.6.3转化为win-exe文件发布的方法
2018/10/31 Python
Python3.5集合及其常见运算实例详解
2019/05/01 Python
Pytorch生成随机数Tensor的方法汇总
2020/09/09 Python
Python利用matplotlib绘制折线图的新手教程
2020/11/05 Python
python对输出的奇数偶数排序实例代码
2020/12/04 Python
使用css3绘制出各种几何图形
2016/08/17 HTML / CSS
澳大利亚最好的在线时尚精品店:Princess Polly
2018/01/03 全球购物
应届生高等护理求职信
2013/10/12 职场文书
高一物理教学反思
2014/01/24 职场文书
行政办公室岗位职责
2014/03/18 职场文书
竞聘演讲稿
2014/04/24 职场文书
我的中国心演讲稿
2014/09/04 职场文书
2015年学校教科室工作总结
2015/07/20 职场文书
Android Flutter实现图片滑动切换效果
2022/04/07 Java/Android