python⼊门:argparse浅析nargs=+作⽤
我就废话不多说了,⼤家还是直接看代码吧~
#aaa.py
#version 3.5
import os #这句是没⽤了,不知道为什么markdown在编辑代码时,不加这⼀句,就不能显⽰代码⾼亮[汗]
import argparse
parser = argparse.ArgumentParser(description='Process ') #初始化⼀个分析器
#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要与上⾯的对应
parse error怎么解决
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)
结果
补充知识: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()传⼊参数,为了能够识别⽂件字符串,如"",需要设置此值,如"@",那么所有以此字符为开头的字符串都被当作是⽂件,所以传给parse_args()的参数应该是@。在该⽂件中,⼀⾏只能有⼀个参数。如⽂件中的'-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 [, 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()
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/l \
--net vgg16  \
-
-set ANCHOR_SCALES "[8,16,32]" ANCHOR_RATIOS "[0.5,1,2]" TRAIN.STEPSIZE "[50000]"
结果为:
Namespace(cfg_file='experiments/l',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='+'作⽤就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。