一 argparse模块
python标准库模块argparse用于解析命令行参数,编写用户友好的命令行界面,该模块还会自动生成帮助信息,并在所给参数无效时报错.
首先看一个例子:
#arg_parse.py
#coding:utf-8
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))
将上述代码保存为arg_parse.py,在命令行运行该脚本。使用-h选项可以查看帮助信息
$ python 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)
如果不指定–sum选项,则找出输入参数中的最大值,否则求和。
$ python prog.py 1 2 3 4
4
$ python prog.py 1 2 3 4 --sum
10
ArgumentParser 对象
使用argparse的第一步是创建一个ArgumentParser对象,这个ArgumentParser对象中会保存所有将命令行参数转为python数据类型的必须信息.使用argparse.ArgumentParser创建ArgumentParser对象.
argparse.ArgumentParser(prog=None,
usage=None,
epilog=None,
parents=[],
formatter_class=argparse.HelpFormatter,
prefix_chars='-',
fromfile_prefix_chars=None,
argument_default=None,
conflict_handler='error',
add_help=True)
下面介绍上述函数几个常用的参数
1.prog
默认情况下,ArgumentParser对象根据sys.argv[0]的值(不包括路径名)生成帮助信息中的程序名.
sys.argv
$ cat myprogram.py
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
也可以人为指定一个程序名
>>> parser = argparse.ArgumentParser(prog='myprogram')
>>> parser.print_help()
usage: myprogram [-h] #注意程序名
optional arguments:
-h, --help show this help message and exit
在ArgumentParser对象的函数中,通过%(prog)s可以引用程序名
>>> parser = argparse.ArgumentParser(prog='myprogram')
>>> parser.add_argument('--foo', help='foo of the %(prog)s program')
>>> parser.print_help()
usage: myprogram [-h] [--foo FOO]
optional arguments:
-h, --help show this help message and exit
--foo FOO foo of the myprogram program
2.使用
默认情况下,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 ...] #这是自动生成的usage信息
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
description
description 用于展示程序的简要介绍信息,通常包括:这个程序可以做什么、怎么做。在帮助信息中 description位于用法信息与参数说明之间
>>> parser = argparse.ArgumentParser(description='A foo that bars')
>>> parser.print_help()
usage: argparse.py [-h] #用法信息
A foo that bars # description
optional arguments: #参数说明
-h, --help show this help message and exit
epilog
与description类似,程序的额外描述信息,位于参数说明之后
>>> 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
5.parents
有时多个解析器可能有相同的参数集,为了实现代码复用,我们可以将这些相同的参数集提取到一个单独的解析器中,在创建其它解析器时通过parents指定父解析器,这样新创建的解析器中就包含了相同的参数集。
>>> 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, 否则会报错(ArgumentParser对象会找到两个-h/-help选项)
6.formatter_class
通过formatter_class可以定制帮助信息,通过一下几种格式化类
class argparse.RawDescriptionHelpFormatter
class argparse.RawTextHelpFormatter
class argparse.ArgumentDefaultsHelpFormatter
class argparse.MetavarTypeHelpFormatter
RawDescriptionHelpFormatter 用于定制description和epilog, 默认情况下description和epilog是自动换行的.
>>> parser = argparse.ArgumentParser(
... prog='PROG',
... description='''this description\n
... was indented weird\n
... 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
利用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 maintains whitespace for all sorts of help text, including argument descriptions.
ArgumentDefaultsHelpFormatter automatically adds information about default values to each of the argument help messages:
7.prefix_chars
一般情况下,我们使用’-‘作为选项前缀,ArgumentParser也支持自定义选项前缀,通过prefix_chars
>>> 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')
8.add_help
是否禁用-h -help选项
>>> 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
三 add_argument()方法
argumentParser.add_argument(name or flags...[,action][,nargs][,const][,default]
[,type][,choices][,required][,help][,metavar][,dest])