源地址 http://blog.iamzsx.me/show.html?id=100001
参考文章 http://docs.python.org/2/library/argparse.html#module-argparse
python 的命令解析argparse
比较方便学习的实例+帮助
# -*- coding: utf -*-
import argparse
args = "-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中的类型不是字符窜,记得指定type
parser.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]
bar
This is a description of argparse_example.py
positional arguments:
bar bar help
optional 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 WORLD
This is a epilog of argparse_example.py
补充action/nargs/const的关系
#补充action 、 const、default
new_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 ,因此匹配default
args2 = 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: 12
new_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,),使程序终止