python命令行解析工具argparse模块

转自: http://www.cnblogs.com/fireflow/p/4841389.html

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

  argparse是python中很好用的一个命令行解析模块,使用它我们可以很方便的创建用户友好型命令行程序。而且argparse会自动生成帮助信息和错误信息。

一、示例

  例如下面的例子,从命令行中获取几个整数,然后获取它们的和或者最大值。

复制代码
import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
                   help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
                   const=sum, default=max,
                   help='sum the integers (default: find the max)')

args = parser.parse_args()
print args.accumulate(args.integers)
复制代码

  从命令行中输入prog.py -h,会显示如下信息

复制代码
$ prog.py -h
usage: prog.py [-h] [--sum] N [N ...]

Process some integers.

positional arguments:
 N           an integer for the accumulator

optional arguments:
 -h, --help  show this help message and exit
 --sum       sum the integers (default: find the max)
复制代码

  如果使用合适的参数,还可以求和或者取得最大值。

$ prog.py 1 2 3 4
4

$ prog.py 1 2 3 4 --sum
10
    如果传递错误的参数,将返回错误信息。
$ prog.py a b c
usage: prog.py [-h] [--sum] N [N ...]
prog.py: error: argument N: invalid int value: 'a'
     下面我们详细解释这个例子:
        1.创建parser
        首先,创建一个ArgumentParser对象。
>>> parser = argparse.ArgumentParser(description='Process some integers.')
        ArgumentParser对象中保存着解析命令行参数所必需的信息。
         2.添加参数
        通过调用add_argument()方法将命令行中的参数保存到ArgumentParser对象中。
>>> parser.add_argument('integers', metavar='N', type=int, nargs='+',
...                     help='an integer for the accumulator')
>>> parser.add_argument('--sum', dest='accumulate', action='store_const',
...                     const=sum, default=max,
...                     help='sum the integers (default: find the max)')

   后面再调用parse_args(),将会返回一个包含integers和accumulate两个属性的对象,integers是一个列表,而accumulate可以是sum()函数(如果指定了--sum)或者max()函数。

  3.解析参数
    通过parse_args()方法解析参数,返回一个命名空间对象。
>>> parser.parse_args(['--sum', '7', '-1', '42'])
Namespace(accumulate=<built-in function sum>, integers=[7, -1, 42])
     如果在脚本中调用这个函数,parse_args()不会解析任何参数。ArgumentParser会从sys.argv中自动检测命令行参数。




argparse. ArgumentParser([ description][,  epilog][,  prog][,  usage][,  add_help][,  argument_default][,  parents][,  prefix_chars][, conflict_handler][,  formatter_class])



      创建一个ArgumentParser对象。每个参数都有其特殊含义,简单的介绍如下:

    • description:help参数之前显示的信息

    • epilog:help参数之后显示的信息。

    • add_help:给解析器添加-h/--help选项(默认为True)

    • argument_default:设置参数的默认值(默认为None)

    • parents:ArgumentParser对象组成列表,这些对象中的参数也要包含进来。

    • prefix_chars:可选参数之前的前缀(默认为-)

    • fromfile_prefix_chars:如果是从文件中读取参数,这个文件名参数的前缀(默认为None)

    • formatter_class:一个自定义帮助信息格式化输出的类

    • conflict_handler:通常不需要,定义了处理冲突选项的策略

    • prog:程序名(默认为sys.argv[0])

    • usage:程序的使用用例,默认情况下会自动生成。

      1.description

      大多数调用ArgumentParser构造函数的例子中都会使用description参数,这个参数会简短的描述这个程序的用途。

复制代码
>>> parser = argparse.ArgumentParser(description='A foo that bars')
>>> parser.print_help()
usage: argparse.py [-h]

A foo that bars

optional arguments:
 -h, --help  show this help message and exit
复制代码

 

   默认情况下,这个描述信息前后都会有一个空行,如果想改变这种显示,可以使用formatter_class参数

 

      2.epilog

      有些程序可能想在描述信息之后再继续展示别的信息,这个时候可以使用epilog参数设置。

复制代码
>>> parser = argparse.ArgumentParser(
...     description='A foo that bars',
...     epilog="And that's how you'd foo a bar")
>>> parser.print_help()
usage: argparse.py [-h]

A foo that bars

optional arguments:
 -h, --help  show this help message and exit

And that's how you'd foo a bar
复制代码

      跟description参数一样,这个信心前后都有一个空行,同样可以通过formatter-class参数设置。

      3.add_help

      默认情况下,ArgumentParser对象对自动添加-h/--help选项,以展示帮助信息。例如,myprogam.py代码如下所示:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo', help='foo help')
args = parser.parse_args()

      如果命令行支持-h/--help参数,则下面的代码输出如下:

$ python myprogram.py --help
usage: myprogram.py [-h] [--foo FOO]

optional arguments:
 -h, --help  show this help message and exit
 --foo FOO   foo help

      通过设置add_help=False可以取消帮助信息的显示

复制代码
>>> parser = argparse.ArgumentParser(prog='PROG', add_help=False)
>>> parser.add_argument('--foo', help='foo help')
>>> parser.print_help()
usage: PROG [--foo FOO]

optional arguments:
 --foo FOO  foo help
复制代码

      4.prefix_chars

      大多数命令行参数使用-作为前缀,但是可以使用prefix_char=argument来自定义前缀。

>>> parser = argparse.ArgumentParser(prog='PROG', prefix_chars='-+')
>>> parser.add_argument('+f')
>>> parser.add_argument('++bar')
>>> parser.parse_args('+f X ++bar Y'.split())
Namespace(bar='Y', f='X')

      5.fromfile_prefix_chars

      有时候需要从文件中获取参数,如果参数过多的话。这时,如果设置了fromfile_prefix_chars参数的话,解析器会将带有这个设定前缀的参数作为文件处理。

>>> with open('args.txt', 'w') as fp:
...    fp.write('-f\nbar')
>>> parser = argparse.ArgumentParser(fromfile_prefix_chars='@')
>>> parser.add_argument('-f')
>>> parser.parse_args(['-f', 'foo', '@args.txt'])
Namespace(f='bar')

      文件中必须是每行对应一个参数。

      6.argument_default

      设置参数的默认值。

复制代码
>>> parser = argparse.ArgumentParser(argument_default=argparse.SUPPRESS)
>>> parser.add_argument('--foo')
>>> parser.add_argument('bar', nargs='?')
>>> parser.parse_args(['--foo', '1', 'BAR'])
Namespace(bar='BAR', foo='1')
>>> parser.parse_args([])
Namespace()
复制代码

      7.parents

      有时候,几个解析器共享一个参数集合,可以将这个共享参数集合传递给parent,解析器对象会将这些共享参数包含在内。

 

复制代码
>>> parent_parser = argparse.ArgumentParser(add_help=False)
>>> parent_parser.add_argument('--parent', type=int)

>>> foo_parser = argparse.ArgumentParser(parents=[parent_parser])
>>> foo_parser.add_argument('foo')
>>> foo_parser.parse_args(['--parent', '2', 'XXX'])
Namespace(foo='XXX', parent=2)

>>> bar_parser = argparse.ArgumentParser(parents=[parent_parser])
>>> bar_parser.add_argument('--bar')
>>> bar_parser.parse_args(['--bar', 'YYY'])
Namespace(bar='YYY', parent=None)
复制代码

 

      注意大多数情况下,父解析器会将add_help设置为False,否则将会出现两个-h/--help选项,从而导致错误。

 

      8.formatter_class

      通过指定formatter_class可以对帮助信息进行格式化输出。这样的类有三个:argparse.RawDescriptionHelpFormatter, argparse.RawTextHelpFormatter 以及argparse.ArgumentDefaultsHelp

      默认情况下,description以及epilog信息前后都有一个空行。

复制代码
>>> parser = argparse.ArgumentParser(
...     prog='PROG',
...     description='''this description
...         was indented weird
...             but that is okay''',
...     epilog='''
...             likewise for this epilog whose whitespace will
...         be cleaned up and whose words will be wrapped
...         across a couple lines''')
>>> parser.print_help()
usage: PROG [-h]

this description was indented weird but that is okay

optional arguments:
 -h, --help  show this help message and exit

likewise for this epilog whose whitespace will be cleaned up and whose words
will be wrapped across a couple lines
复制代码

 

      如果将formatter_class参数设置为argparse.RawDescriptionHelpFormatter,则description和epilog将会按原样输出。

复制代码
>>> parser = argparse.ArgumentParser(
...     prog='PROG',
...     formatter_class=argparse.RawDescriptionHelpFormatter,
...     description=textwrap.dedent('''\
...         Please do not mess up this text!
...         --------------------------------
...             I have indented it
...             exactly the way
...             I want it
...         '''))
>>> parser.print_help()
usage: PROG [-h]

Please do not mess up this text!
--------------------------------
   I have indented it
   exactly the way
   I want it

optional arguments:
 -h, --help  show this help message and exit
复制代码

 

      RawTextHelpFormatter则会保留预定义的帮助信息中的空格。

      另外一个类ArgumentDefaultsHelpFormatter则会给所有的有默认值的参数添加默认值信息。

 

复制代码
>>> parser = argparse.ArgumentParser(
...     prog='PROG',
...     formatter_class=argparse.ArgumentDefaultsHelpFormatter)
>>> parser.add_argument('--foo', type=int, default=42, help='FOO!')
>>> parser.add_argument('bar', nargs='*', default=[1, 2, 3], help='BAR!')
>>> parser.print_help()
usage: PROG [-h] [--foo FOO] [bar [bar ...]]

positional arguments:
 bar         BAR! (default: [1, 2, 3])

optional arguments:
 -h, --help  show this help message and exit
 --foo FOO   FOO! (default: 42)
复制代码

      9.conflict_handler

 

      ArgumentParser对象不允许传入两个相同的参数,否则会报错。

 

>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-f', '--foo', help='old foo help')
>>> parser.add_argument('--foo', help='new foo help')
Traceback (most recent call last):
 ..
ArgumentError: argument --foo: conflicting option string(s): --foo

      通过设置conflict_handler为resolve,可以用新的参数覆盖旧的同名参数。    

复制代码
>>> parser = argparse.ArgumentParser(prog='PROG', conflict_handler='resolve')
>>> parser.add_argument('-f', '--foo', help='old foo help')
>>> parser.add_argument('--foo', help='new foo help')
>>> parser.print_help()
usage: PROG [-h] [-f FOO] [--foo FOO]

optional arguments:
 -h, --help  show this help message and exit
 -f FOO      old foo help
 --foo FOO   new foo help
复制代码

      10.prog

 

      默认情况下,ArgumentParser对象使用sys.argv[0]来获取程序名。大多数情况下下,默认值就足够了,例如:

 

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo', help='foo help')
args = parser.parse_args()
    这种情况,帮助信息会如下所示:
 
  
复制代码
$ python myprogram.py --help
usage: myprogram.py [-h] [--foo FOO]

optional arguments:
 -h, --help  show this help message and exit
 --foo FOO   foo help
$ cd ..
$ python subdir\myprogram.py --help
usage: myprogram.py [-h] [--foo FOO]

optional arguments:
 -h, --help  show this help message and exit
 --foo FOO   foo help
复制代码

 

      如果想改变这个默认值,可以设置prog。

 

>>> parser = argparse.ArgumentParser(prog='myprogram')
>>> parser.print_help()
usage: myprogram [-h]

optional arguments:
 -h, --help  show this help message and exit

      11.usage

 

      默认情况下,ArgumentParser对象会自动计算出程勋的用法示例  

 

复制代码
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--foo', nargs='?', help='foo help')
>>> parser.add_argument('bar', nargs='+', help='bar help')
>>> parser.print_help()
usage: PROG [-h] [--foo [FOO]] bar [bar ...]

positional arguments:
 bar          bar help

optional arguments:
 -h, --help   show this help message and exit
 --foo [FOO]  foo help
复制代码

    这个默认的信息可以通过设置usage来覆盖。

 

 

复制代码
>>> parser = argparse.ArgumentParser(prog='PROG', usage='%(prog)s [options]')
>>> parser.add_argument('--foo', nargs='?', help='foo help')
>>> parser.add_argument('bar', nargs='+', help='bar help')
>>> parser.print_help()
usage: PROG [options]

positional arguments:
 bar          bar help

optional arguments:
 -h, --help   show this help message and exit
 --foo [FOO]  foo help
复制代码
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值