python argparse (续一)

来源:互联网 发布:淘宝可以相似图片搜索 编辑:程序博客网 时间:2024/06/05 00:17

源地址  http://blog.iamzsx.me/show.html?id=100001

参考文章 http://docs.python.org/2/library/argparse.html#module-argparse


python 的命令解析argparse

比较方便学习的实例+帮助

# -*- coding: utf -*-import argparseargs = "-f hello.txt -n 1 2 3 -x 100 -y b -z a -q hello @args.txt i_am_bar -h".split()#使用@args.txt要求fromfile_prefix_chars="@"#args.txt 文件中应该一行一个参数,想改变行为参数#convert_arg_line_to_args()#ArgumentParser参数的简单说明##description -命令行帮助的开始文字,大部分情况下,我们只会用到这个参数#epilog -命令行帮助的结尾文字#prog - (default: sys.arg[0])程序的名字,一般不需要修改,另外,如果你需要再help中使用到程序的名字,可以使用%(prog)s#prefix_chars -命令的前缀, 默认是- 例如-f/--file。有些程序可能希望支持/f这样的选项,可以使用prefix_chars="/"#fromfile_prefix_chars - (default:None)如果希望命令行参数可以从文件中读取,就可能用到。例如,如果fromfile_prefix_chars='@',命令行参数中有一个为“@args.txt",args.txt 的内容会作为命令行参数#add_help -是否增加-h/-help选项(default=True),一般help信息都是必须的,所以不用设置。#parents -类型是list, 如果这个parser的一些选项跟其他某些parser的选项一样,可以用parents来实现集成,例如parents=[parent_parser]##formatter_class -自定义帮助信息的格式(description和epilog)。默认情况下会将长的帮助信息进行<自动换行和消除多个连续空白>.#三个允许的值:# class argparse.RawDescriptionHelpFormatter 直接输出description和epilog的原始形式(不进行自动换行和消除空白的操作)#class argparse.RawTextHelpFormatter 直接输出description和epilog以及add_argument中的help字符窜的原始形式(不进行自动换行和消除空白的操作)##class argparse.ArgumentDefaultHelpFormatter在每个选项的帮助信息后面输出他们对应的缺省值,如果有设置的话。这个最常用。#argument default -(default:None) 设置一个全局的选项的缺省值,一般每个选项单独设置,所以这个参数用得少,不细说。#usage -(default:generated)如果你需要修改usage的信息(usage:PROG [-h] [--foo [FOO]] bar [bar ...]),那么可以修改这个,一般不修改)#conflict_handler -不建议使用。这个在极端情况下才会用到,主要是定义两个add_argument中添加的选项的名字发生冲突时怎么处理,默认处理是抛出异常。#注释一行有##表示这几个参数比较常用parser = argparse.ArgumentParser(description="This is a description of %(prog)s", epilog="This is a epilog of %(prog)s", prefix_chars="-+",fromfile_prefix_chars="@", formatter_class=argparse.ArgumentDefaultsHelpFormatter)#ArgumentParser.add_arguent(name or flags ...[,action][,nargs][,const][,default][,type][,choices][,requierd][,help][,metavar][,dest]#add_argument的参数#name or flags -指定参数的形式,想写几个写几个,一般写两个,一个短参数,一个长参数,例子“-f","--file"#可选的选项,位置不固定,想怎么写酒怎么写,默认是可选的parser.add_argument("-f","--file",help="file hellp")#位置固定的选项,如"prog i_am_bar",这样,i_am_bar就是bar选项的值,默认是必须有的parser.add_argument("bar", help="bar help")#nargs -指定这个参数后面的value有多少个,例如希望使用-n 1 2 3 4 来设置n的值为[1,2,3,4]parser.add_argument("-n", "--num", nargs="+", type=int)#这里nargs=”+“ 表示 如果你指定了-n选项,那么-n 后面至少要跟一个参数,+表示至少一个,?表示0/1,*表示0/多个#default -如果命令行没有出现这个选项,那么使用default指定的默认值parser.add_argument("+g", "++gold", help="gold help", default="test_gold")#这里需要prefix_chars包含“++”#type -如果希望传进来的参数是指定的类型(例如float,int or file等可能从字符窜转换过来的类型)可以使用parser.add_argument("-x", type=int)#choice -设置参数值的范围,如果choices中的类型不是字符窜,记得指定typeparser.add_argument("-y", choices=['a','b','d'])#required - 通常-f这样的参数是可选的,但是如果required=True那么就是必须的了parser.add_argument("-z", choices=['a','b','d'],required=True)#metavar - 参数的名字,再显示帮助信息时才用到parser.add_argument("-o", metavar="OOOOO")#help -设置这个选项的帮助信息#dest -设置这个选项的值,就是解析出来后放到哪个属性中parser.add_argument("-q", dest="world")args = parser.parse_args(args)#若没有args参数,那么就使用sys.argv,也就是命令行参数。有该参数,方便调试#args.world就是-q 的值print args

运行结果

cloud@ubuntu22:~/workspace/pythontest/argparse$ vim argparse_example.py usage: argparse_example.py [-h] [-f FILE] [-n NUM [NUM ...]] [+g GOLD] [-x X]                           [-y {a,b,d}] -z {a,b,d} [-o OOOOO] [-q WORLD]                           barThis is a description of argparse_example.pypositional arguments:  bar                   bar helpoptional arguments:  -h, --help            show this help message and exit  -f FILE, --file FILE  file hellp (default: None)  -n NUM [NUM ...], --num NUM [NUM ...]  +g GOLD, ++gold GOLD  gold help (default: test_gold)  -x X  -y {a,b,d}  -z {a,b,d}  -o OOOOO  -q WORLDThis is a epilog of argparse_example.py
补充action/nargs/const的关系

#补充action 、 const、defaultnew_parser = argparse.ArgumentParser(prog="new")new_parser.add_argument("-addr", action="store_const", const="12", default='34')#const 和default都是设置默认值,#但const匹配给出的命令名称,且与nargs='?' 一起使用#default匹配没有给出命令行名称new_parser.add_argument("-a", nargs="?", const='12',default="34")new_parser.add_argument("-b", nargs="?",default="34")new_parser.add_argument("-c",default="34")args1 = new_parser.parse_args('-addr'.split())#args1 = Namespace(a='34', addr='12', b='34', c='34')#没有给出命令名称-a 和-b ,因此匹配defaultargs2 = new_parser.parse_args('-addr -a -b'.split())#args2 = Namespace(a='12', addr='12', b=None, c='34')#给出命令名称-a -b,因此匹配const,-b没有指定const,因此匹配的const=None#对于new_parser.add_argument("-c",default="34")#没有指定const以及nargs,因此匹配字符窜不能出现不带参数的-c,会提示出错#如new_parser.parse_args('-addr -a -b -c'.split())#出错信息new: error: argument -c: expected one argument#action 和const的使用情况new_parser.add_argument('-d', default='34')#没有给出action,默认情况下,action='store',即保存匹配的值#new_parser.parse_args('-d 100'.split())#new_parser.add_argument('-e', action='store_const', const='12', default = '34')#匹配保存const的值,需要给出const,不然出错new_parser.add_argument('-f', action='store_true', default="34")#匹配保存true,不能给出const,及命令行参数,不然出错#arg = '-f 12' 抛异常 new: error: unrecognized arguments: 12new_parser.add_argument('-g', action='append')#匹配出来为列表,且可重复给出-g的命令行参数来匹配#此外,action可以定义一个具有__call__的类,对values进行重新包装class FooAction(argparse.Action):    def __call__(self, parser, namespace, values, option_string=None):        new_values = values + "add"        print "%r %r %r" %(namespace, new_values, option_string)        setattr(namespace, self.dest, new_values)new_parser.add_argument('--foo', action=FooAction)arg3 = new_parser.parse_args('-d 10 -e -f -g arg1 -g arg2 --foo hihi'.split())arg4 = new_parser.parse_args('-g ok'.split())#arg3 = Namespace(a='34', addr='34', b='34', c='34', d='10', e='12', f=True, foo='hihiadd', g=['arg1', 'arg2'])#arg4 = Namespace(a='34', addr='34', b='34', c='34', d='34', e='34', f='34', foo=None, g=['ok']) 


注意:

args 有参数-h时,会输出帮助文档,并且抛出一个SystemExit(0,),使程序终止


原创粉丝点击