python的命令行解析模块
在命令行模式下每个程序都有输入和输出参数需要指定,可以使用各种方式来完成这点,比如将特定位置的命令行输入解释为特定输入或者输出参数,例如argv[1]为输入文件的名字,argv[2]为输出文件的名字,在这种情况下第几个参数的作用已经被指定,一般来说不利于程序的修改和扩展,如果要增加新的输入或者输出,有可能要对某个位置对应的参数进行重新指定,这是很不方便的。第二种方法就是使用命令行参数来获得相应的输入和输出。如果使用这种方法,在命令行下启动程序时的输入可能如下: ./program build --long-foo t -short-foo x, 这里使用两个“-”符号的命令行参数成为“长格式”的命令行参数,使用一个"-"符号的成为“短格式“的命令行参数,无论是“长格式”的命令行参数还是“短格式”的命令行参数,都可以归为一类,称之为可选的参数,意思就是可以提供也可以不提供的参数,第一个“build”代表另一类命令行参数,表示那些程序启动时必须的参数,如果忽略则程序不应该启动,这类参数称为位置参数。使用多个这类参数的效果类似于我们初始的想法,即将固定位置的命令行参数解释为特定输入参数。但是差异仍然是有的,如果既有可选参数,也有位置参数,那么可选参数和位置参数的位置以任意的顺序出现,只要位置参数出现即可,但是位置参数的相对顺序是不能改变的,因为位置参数就是靠相对位置来解释对应参数的意义的。python中的argparse库完全实现了这些功能,并且在python2.7中成为内置模块,其他更低版本的python可以使用相应的库文件来安装。
使用的方式如下:1. import argparse; 2. 创建一个命令行解释器,使用argparse模块中的ArgumentParser函数来创建,例如: parser=argparse.ArgumentParser( ... ) 3. 在解释器中添加相应的命令行选项,例如: parser.add_argument( ... ) 4. 调用解释器的函数,获取解析的结果。例如: ret = parser.parse_args( ... )。 下面重点解释第三步的操作。( "..."表示需要相应的参数 )
ArgumentParser.add_argument( name or flags... [, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest]),这个函数用于添加相应需要解析的命令选项。name or falgs必须为一个字符串,它的格式即决定了是使用”长格式“参数,”短格式“参数还是位置参数。假如创建一个长格式的参数,可以使用如下方式调用 parser.add_argument("--foo");如果是短格式,则调用方式为 parser.add_argument("-foo");可以看到唯一的差异在于”-“符号的个数,但是一般来说”长格式“的参数较长,而”短格式“则只有一个字符。创建位置参数可以使用如下方式: parser.add_argument("foo")。有这样一个规则:所有不以”-“开头的参数都假定为位置参数,不同的位置参数如何解析取决于他们在整个位置参数序列中的相对位置,而整个位置参数的相对顺序是由添加位置参数时确定的。action参数表明当解析到这个命令行参数时需要进行何种操作。有”store“:存储命令行参数的值;”store_const":存储[const]选项的值,“store_true” or “store_false”:存储True或者False;“append”:将这个参数值添加到一个列表中,适用于适用于多次出现的命令行参数;“append_const”:将一个固定值存储到列表中。[nargs]用于指定这个命令行参数有多少个值,可以是1,3,100等确定的值,也可以是“*”,“+”,“?”等字符串。“*”,“+”,“?”跟他们在正则表达式中的含义是一样的,“*”,“?”表示这个命令行参数可以不指定值,如果没有值,但是这个选项出现在命令行中,那么这个选项的值有[const]参数决定,如果连这个命令行选项都没有出现,那么这个选项的值有[default]参数决定。[type]表示参数的类型,可以是float,int,file等中的任一个。[choice]表示这个命令行参数的取值只能为[choice]给定集合中的一个。[required]如果为True则表示这个命令行选项必须出现,这样可以要求一个可选参数必须指定一个值。[help]是帮助信息,[metavar]指定在显示帮助时,指代这个选项的名称。[dest]表示如何从结果中引用一个值。