我就废话不多说了,大家还是直接看代码吧~
#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)
结果
补充知识: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="htmlcode">
#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='+'作用就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。