码迷,mamicode.com
首页 > 编程语言 > 详细

python命令行解析工具argparse模块【3】

时间:2015-09-26 22:35:00      阅读:391      评论:0      收藏:0      [点我收藏+]

标签:

        上一节,我们讲解了ArgumentParser对象,这一节我们将学习这个对象的add_argument()方法。

        add_argument()方法的定义了如何解析一个命令行参数,每个参数都有各自独立的设置参数。
        1.name or flags
        add_argument()必须知道参数是可选的还是必须的位置参数,第一个传递给add_arguments的参数必须是可选参数或者是位置参数,例如,下面是可选参数。
  1. >>> parser.add_argument(-f,--foo)
         而位置参数如下设置:
  1. >>> parser.add_argument(bar)
        当调用parse_args()函数时,可选参数通过加上前缀-来明确,剩下的参数将被指定为位置参数。
  1. >>> parser = argparse.ArgumentParser(prog=PROG)
    >>> parser.add_argument(-f,--foo)
    >>> parser.add_argument(bar)
    >>> parser.parse_args([BAR])
    Namespace(bar=BAR, foo=None)
    >>> parser.parse_args([BAR,--foo,FOO])
    Namespace(bar=BAR, foo=FOO)
    >>> parser.parse_args([--foo,FOO])
    usage: PROG [-h][-f FOO] bar
    PROG: error: too few arguments
    2.action
        action参数指定了参数是如何被处理的。支持额操作如下:
        store:这个只是简单的存储这个参数值,这也是默认操作。
  1. >>> parser=argparse.ArgumentParser()
    >>> parser.add_argument(--foo)
    >>> parser.parse_args(--foo 1.split())
    Namespace(foo=1)
        store_const:存储const指定的值。
  1. >>> parser=argparse.ArgumentParser()
    >>> parser.add_argument(--foo,action=store_const,const=42)
    >>> parser.parse_args(--foo.split())
    Namespace(foo=42)
        store_false和store_true:分别对应存储True和False值。它们是store_const的特例。
  1. >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument(--foo, action=store_true)
    >>> parser.add_argument(--bar, action=store_false)
    >>> parser.parse_args(--foo --bar.split())
    Namespace(bar=False, foo=True)
        append:保存为列表格式,将每个参数的值添加到这个列表。
  1. >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument(--foo, action=append)
    >>> parser.parse_args(--foo 1 --foo 2.split())
    Namespace(foo=[1,2])
        append_const:保存为列表,但是值必须是const指定参数的值。
  1. >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument(--str, dest=types, action=append_const, const=str)
    >>> parser.add_argument(--int, dest=types, action=append_const, const=int)
    >>> parser.parse_args(--str --int.split())
    Namespace(types=[<type str>,<type int>])
        version:需要指定version参数,当调用add_argument方法时,会打印版本信息并退出。
  1. >>>import argparse
    >>> parser = argparse.ArgumentParser(prog=PROG)
    >>> parser.add_argument(--version, action=version, version=%(prog)s 2.0)
    >>> parser.parse_args([--version])
    PROG 2.0
         你也可以通过继承Action类来实现自定义action类型,通过继承argparse.action,并提供__call__()方法,提供四个参数。
         parser:ArgumentParser对象。
         namespace:parse_args()返回的命名空间。
          values:相关联的命令行参数
         option_string:可选字符串,用来触发action,如果没有指定,就通过位置参数来关联。
  1. >>> classFooAction(argparse.Action):
    ...    def__call__(self,parser,namespace,values,option_string=None):
    ...        print%r%r%r%(namespace,values,option_string)
    ...        setattr(namespace,self.dest,values)
    ...
    >>> parser=argparse.ArgumentParser()
    >>> parser.add_argument(--foo,action=FooAction)
    >>> parser.add_argument(bar,action=FooAction)
    >>> args=parser.parse_args(1 --foo 2.split())
    Namespace(bar=None, foo=None)1None
    Namespace(bar=1, foo=None)2‘‘--foo
    >>> args
    Namespace(bar=1, foo=2)
         3.nargs
         nargs参数将几个不同的参数跟action关联,支持的值如下:
         N(一个整数):N个从命令行中获取的参数将会组成一个列表。 
  1. >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument(--foo, nargs=2)
    >>> parser.add_argument(bar, nargs=1)
    >>> parser.parse_args(c --foo a b.split())
    Namespace(bar=[c], foo=[a,b])
    Note that ``nargs=1`` produces a list of one item.Thisis different from
    the default,in which the item is produced by itself.
        "?":从命令行参数中获取一个值,如果没有任何参数提供,则会使用default提供的默认值,注意对于可选参数的一种特殊情况,可选字符串提供了,但是后面没有接参数,这时会使用const值。
  1. >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument(--foo, nargs=?, const=c, default=d)
    >>> parser.add_argument(bar, nargs=?, default=d)
    >>> parser.parse_args(XX --foo YY.split())
    Namespace(bar=XX, foo=YY)
    >>> parser.parse_args(XX --foo.split())
    Namespace(bar=XX, foo=c)
    >>> parser.parse_args(‘‘.split())
    Namespace(bar=d, foo=d)
        另外一种情况是通过?来支持可选的输入输出文件。
  1. >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument(infile, nargs=?, type=argparse.FileType(r), default=sys.stdin)
    >>> parser.add_argument(outfile, nargs=?, type=argparse.FileType(w), default=sys.stdout)
    >>> parser.parse_args([input.txt,output.txt])
    Namespace(infile=<open file input.txt, mode r at 0x...>, outfile=<open file output.txt, mode w at 0x...>)
    >>> parser.parse_args([])
    Namespace(infile=<open file <stdin>, mode r at 0x...>, outfile=<open file <stdout>, mode w at 0x...>)
         "*":支持多个参数值。
  1. >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument(--foo, nargs=*)
    >>> parser.add_argument(--bar, nargs=*)
    >>> parser.add_argument(baz, nargs=*)
    >>> parser.parse_args(a b --foo x y --bar 1 2.split())
    Namespace(bar=[1,2], baz=[a,b], foo=[x,y])
        "+" :跟*的作用类似,但是如果没有提供参数的会报错。
  1. >>> parser = argparse.ArgumentParser(prog=PROG)
    >>> parser.add_argument(foo, nargs=+)
    >>> parser.parse_args(a b.split())
    Namespace(foo=[a,b])
    >>> parser.parse_args(‘‘.split())
    usage: PROG [-h] foo [foo ...]
    PROG: error: too few arguments
        如果没有提供nargs参数的话,参数个数将由action来决定,默认情况下同单个参数。
        4.const

        const保存的值为不需要从命令行中读取但是对于ArgumentParser对象的action操作来说又必须的值。一般用于以下两个用途。
        当action=‘store_const‘或者action="append_const"的时候
        当使用可选参数,并且narg=?的时候,并且命令行参数没有给出可选字符串以及可选参数的时候。
        5.default
        default设置默认值。如果可选参数没有提供可选字符串。则
  1. >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument(--foo, default=42)
    >>> parser.parse_args(--foo 2.split())
    Namespace(foo=2)
    >>> parser.parse_args(‘‘.split())
    Namespace(foo=42)
    对于带nargs=?或者*的位置参数,当命令行参数没有提供的时候将使用默认值。
  1. >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument(foo, nargs=?, default=42)
    >>> parser.parse_args(a.split())
    Namespace(foo=a)
    >>> parser.parse_args(‘‘.split())
    Namespace(foo=42)
    如果提供default=argparse.SUPPRESS的话,这时不会有任何属性添加到命名空间。
    6.type
  
   默认情况下下,ArgumentParser将从命令行中读取的参数视为string类型,但是有时候也可以指定为其他类型。
  1. >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument(foo, type=int)
    >>> parser.add_argument(bar, type=file)
    >>> parser.parse_args(2 temp.txt.split())
    Namespace(bar=<open file temp.txt, mode r at 0x...>, foo=2)
        为了简便文件参数的使用,argparser模块提供了FileType类工厂。
  1. >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument(bar, type=argparse.FileType(w))
    >>> parser.parse_args([out.txt])
    Namespace(bar=<open file out.txt, mode w at 0x...>)
        type属性还可以接收一个回调函数,这个回调函数接收一个命令行参数并返回转换类型之后的值 
  1. >>>def perfect_square(string):
    ... value = int(string)
    ... sqrt = math.sqrt(value)
    ... if sqrt != int(sqrt):
    ...     msg ="%r is not a perfect square"% string
    ...     raise argparse.ArgumentTypeError(msg)
    ... return value
    ...
    >>> parser = argparse.ArgumentParser(prog=PROG)
    >>> parser.add_argument(foo, type=perfect_square)
    >>> parser.parse_args(9.split())
    Namespace(foo=9)
    >>> parser.parse_args(7.split())
    usage: PROG [-h] foo
    PROG: error: argument foo:7isnot a perfect square
        如果提供choices参数的话,可以检测值的范围。
  1. >>> parser = argparse.ArgumentParser(prog=PROG)
    >>> parser.add_argument(foo, type=int, choices=xrange(5,10))
    >>> parser.parse_args(7.split())
    Namespace(foo=7)
    >>> parser.parse_args(11.split())
    usage: PROG [-h]{5,6,7,8,9}
    PROG: error: argument foo: invalid choice:11(choose from5,6,7,8,9)
    7.choices
    有时候需要限制参数在某个范围之内,这时可以通过choices提供这个参数范围,如果提供的参数值不在这个范围之内,那么会报错。
  1. >>> parser = argparse.ArgumentParser(prog=PROG)
    >>> parser.add_argument(foo, choices=abc)
    >>> parser.parse_args(c.split())
    Namespace(foo=c)
    >>> parser.parse_args(X.split())
    usage: PROG [-h]{a,b,c}
    PROG: error: argument foo: invalid choice:X(choose froma,b,c)
    注意,如果包含type参数的话,只有type参数的条件满足之后才会检查给定的参数值是否在choices之内。
  1. >>> parser = argparse.ArgumentParser(prog=PROG)
    >>> parser.add_argument(foo, type=complex, choices=[1,1j])
    >>> parser.parse_args(1j.split())
    Namespace(foo=1j)
    >>> parser.parse_args(-- -4.split())
    usage: PROG [-h]{1,1j}
    PROG: error: argument foo: invalid choice:(-4+0j)(choose from1,1j)
    所有支持in运算符的对象都可以赋给choices,所以dict、set、list都可以。
    8.required
    一般情况下,argparse模块将带"-"前缀(例如-f)或者带"--"前缀的(例如--bar)的参数视为可选参数,,为了使可选参数变成必须参数,可以设置required值为True。
  1. >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument(--foo, required=True)
    >>> parser.parse_args([--foo,BAR])
    Namespace(foo=BAR)
    >>> parser.parse_args([])
    usage: argparse.py [-h][--foo FOO]
    argparse.py: error: option --foo is required
    如果设置了required为真,并且也没有提供这个参数值,则报错。
    9.help
    当用户使用-h 或者--help参数时,显示额帮助信息。
  1. >>> parser = argparse.ArgumentParser(prog=frobble)
    >>> parser.add_argument(--foo, action=store_true,
    ... help=foo the bars before frobbling)
    >>> parser.add_argument(bar, nargs=+,
    ... help=one of the bars to be frobbled)
    >>> parser.parse_args(-h.split())
    usage: frobble [-h][--foo] bar [bar ...]
    positional arguments:
    bar one of the bars to be frobbled
    optional arguments:
    -h,--help show this help message and exit
    --foo foo the bars before frobbling
    help中可以使用格式化信息。例如
  1. >>> parser = argparse.ArgumentParser(prog=frobble)
    >>> parser.add_argument(bar, nargs=?, type=int, default=42,
    ... help=the bar to %(prog)s (default: %(default)s))
    >>> parser.print_help()
    usage: frobble [-h][bar]
    positional arguments:
    bar the bar to frobble (default:42)
    optional arguments:
    -h,--help show this help message and exit
    10.metavar
    当ArgumentParser生成帮助信息的时候,它需要通过某种方式来引用参数,对于位置参数,参数直接引用,对于可选参数,将其转换成大写再引用。
  1. >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument(--foo)
    >>> parser.add_argument(bar)
    >>> parser.parse_args(X --foo Y.split())
    Namespace(bar=X, foo=Y)
    >>> parser.print_help()
    usage:[-h][--foo FOO] bar
    positional arguments:
    bar
    optional arguments:
    -h,--help show this help message and exit
    --foo FOO
    除此之外,还可以通过metavar指定别名。
  1. >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument(--foo, metavar=YYY)
    >>> parser.add_argument(bar, metavar=XXX)
    >>> parser.parse_args(X --foo Y.split())
    Namespace(bar=X, foo=Y)
    >>> parser.print_help()
    usage:[-h][--foo YYY] XXX
    positional arguments:
    XXX
    optional arguments:
    -h,--help show this help message and exit
    --foo YYY
        注意metavar只改变显示的名字,不同的nargs参数值,可能导致metavar参数需要使用多次,这时可以提供metavar参数来生成不同的显示。
  1. 1 >>> parser = argparse.ArgumentParser(prog=PROG)
    2 >>> parser.add_argument(-x, nargs=2)
    3 >>> parser.add_argument(--foo, nargs=2, metavar=(bar,baz))
    4 >>> parser.print_help()
    5 usage: PROG [-h][-x X X][--foo bar baz]
    6 optional arguments:
    7 -h,--help show this help message and exit
    8 -x X X
    9 --foo bar baz
    11.dest
    ArgumentParser对象通过dest来指定要传入的参数值。
  1. >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument(bar)
    >>> parser.parse_args(XXX.split())
    Namespace(bar=XXX)
        对于可选参数,dest的值根据可选参数的不同而相应改变,如果是完整字符串,使用去掉--前缀之后的字符串,如果是简短名,则使用去除-前缀之后的字符串,如果字符串中间带有-,则将-替换成_以使这个字符串合法。
  1. >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument(-f,--foo-bar,--foo)
    >>> parser.add_argument(-x,-y)
    >>> parser.parse_args(-f 1 -x 2.split())
    Namespace(foo_bar=1, x=2)
    >>> parser.parse_args(--foo 1 -y 2.split())
    Namespace(foo_bar=1, x=2)
        dest允许设置自定义名字:
  1. >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument(--foo, dest=bar)
    >>> parser.parse_args(--foo XXX.split())
    Namespace(bar=XXX)

python命令行解析工具argparse模块【3】

标签:

原文地址:http://www.cnblogs.com/fireflow/p/4841389.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!