@TOC
argparse模块
argparse模块是python的一个命令行解析包,可以直接让我们在命令行向程序中传入参数和修改参数,argparse模块内置于python中,不需要另外安装
试想在一个project中,我们有5个参数(p1,p2,p3,p4,p5),有两个py文件,其中py1用到了(1,2,3,4),py2用到了(1,2,3,5)但是在py1和py2中我们的参数p3的值不同。如果我们不用argparse模块,首先,我们需要在两个文件中分别定义各自的参数以及相应的值,然后运行,每次我们修改参数值的时候都需要进入到程序中进行修改,修改不便。其次,我们需要在两个文件中分别定义参数,相当于参数1,2,3多定义了一次。当我们用argparse模块时,上述的五个参数只需要定义一次,且当某个参数需要修改时我们只需要在命令行中给出他的修改值就可以了
一、基本用法
argparse官方文档
构建argparse模块主要分为四步:
导入argparse模块
创建ArgumentParser对象:ArgumentParser对象包含将命令行解析成python数据类型所需的全部信息
添加参数:给上述创建的对象添加参数,调用add_argument()方法
解析参数:将上述添加的参数进行解析,调用parse_args()方法
下面展示一个简单的例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 import argparse parser = argparse.ArgumentParser() parser.add_argument("number" , help ="请输入数字" , type =int ) parser.add_argument("str" , help ="请输入字符串" , type =str ) args = parser.parse_args() print (args.number+10 )print (args.str )''' 运行python example.py --------------------- usage: example.py [-h] number str example.py: error: the following arguments are required: number, str 运行python example.py -h ------------------------- usage: example.py [-h] number str positional arguments: number 请输入数字 str 请输入字符串 optional arguments: -h, --help show this help message and exit 运行python example.py 5 hello, world ------------------------------------ 15 hello,world '''
python example.pynumber和str是必须赋值的变量,不赋值会产生错误提示(在参数前加上- - 变为可选参数)
python example.py -h查看提示信息
python example.py 5 hello, world正确赋值,成功运行
此时我们print(args),输出为:Namespace(number=5, str='hello,world'),可以看出args是Namespace数据类型,它是一种类似于字典的数据类型,我们可以使用args.param来提取这个参数,例如args.number
补充: add_argument()中有一些参数,其中help是对参数的解释说明,type是变量的类型,下面还会介绍更多的参数
二、几个常用参数
1. 可选参数(–)与默认值(default)
上述的number和str都是位置参数(positional argument)也就是必选,若要变为可选参数,只需要在变量前加--即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import argparseparser = argparse.ArgumentParser() parser.add_argument("--number" , help ="请输入数字" , type =int ) parser.add_argument("--str" , default="hello,world" , help ="请输入字符串" , type =str ) args = parser.parse_args() print (args)''' 运行python example2.py ---------------------- Namespace(number=None, str='hello,world') 运行python example2.py --number=2 --str="nihao" ---------------------------------------------- Namespace(number=2, str='nihao') '''
参数中default为默认值,即没有给变量赋值时的默认值
如果我们想把可选参数变为必选,只需要在相应的语句中加入“required=True”即可,例如上述number必须提供一个数值的话parser.add_argument("--number", type=int, required=True, help="请输入数字"),此时如果在命令行中运行的时候不给number提供参数就会报错
2. action
action是一种新的赋值方式,主要决定参数为True or False
action=‘store_true’,在运行时指定了该参数他就为True,否则为False
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import argparseparser = argparse.ArgumentParser() parser.add_argument('--t' , help =' ' , action='store_true' ) opt = parser.parse_args() print (opt.t)''' python example.py ----------------- False python example.py --t --------------------- True '''
metavar用来控制命令行参数的显示,并且只影响相应参数的显示信息,不影响代码内部获取命令行参数的对象,例如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import argparseparser = argparse.ArgumentParser() parser.add_argument('--foo' , metavar="xxx" , help ="a number to Sam" ) parser.add_argument('bar' , metavar="yyy" ) parser.parse_args('X --foo Y' .split()) parser.print_help() ''' python metavar.py ----------------- usage: a.py [-h] [--foo xxx] yyy positional arguments: yyy optional arguments: -h, --help show this help message and exit --foo xxx a number to Sam '''
可以看到输出中–foo后面出了help信息还多了xxx也就是metavar中的内容,这会让帮助信息更好看些
除此之外,对于有nargs参数的命令行参数,可以用metavar设置每一个具体参数的名称(用元祖将多个参数合并)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import argparseparser = argparse.ArgumentParser(prog='PROG' ) parser.add_argument('-x' , nargs=2 ) parser.add_argument('--foo' , nargs=2 , metavar=('bar' , 'baz' )) parser.print_help() ''' python metavar.py ----------------- usage: PROG [-h] [-x X X] [--foo bar baz] optional arguments: -h, --help show this help message and exit -x X X --foo bar baz '''
此时–foo后面多了bar和baz两个参数,用来解释给–foo输出的参数名字
4. dest
dest顾名思义,就是目的的意思。加入了此参数后,不论原变量是什么,最终都会变为dest的值。我们先介绍两个关于位置参数和可选参数的例子
上述的可选参数“–param”或者位置参数“param”实际上在被赋值时都是在向add_argument()方法中的dest关键字进行赋值,即虽然我们没有指定dest这个变量,但是我们对param进行赋值之后,dest的名字就是param,也就是参数名的归宿就是dest
下面举例说明
1 2 3 4 >>> import argparse>>> parser = argparse.ArgumentParser()>>> parser.add_argument("--a" )_StoreAction(option_strings=['--a' ], dest='a' , nargs=None , const=None , default=None , type =None , choices=None , help =None , metavar=None )
可以看到我们指定了一个可选参数a,并没有指定其他参数,在下面的StoreAction中看到只有dest的值变了且为a,也就是说dest就是参数名的最终归宿,如果我们提前指定了dest=b,那么即使我们对a赋值,最终参数空间也没有a,而是b。例如
1 2 3 4 5 6 7 8 9 10 11 12 13 import argparseparser = argparse.ArgumentParser() parser.add_argument('-f' , '--foo-bar' , '-foo' ) parser.add_argument('-x' , '-y' ) a = parser.parse_args('-f 1 -x 2' .split()) print (a)b = parser.parse_args('--foo 1 -y 2' .split()) print (b)''' Namespace(foo_bar='1', x='2') Namespace(foo_bar='1', x='2') '''
理解上述程序首先需要理解参数的优先级。可选参数(带有“–”)具有最高的赋值优先级,即不论我们对语句中的哪个参数进行赋值,最终都是赋值给了第一个带有(–)的参数;如果参数全都是只有一个(-),那么就赋值给第一个带有(-)的参数
看上述例子,我们对-f进行赋值,但是因为他的优先级比--foo-bar低,因此最终的dest为foo-bar
在知道add_argument()方法可以有多个参数以及最终不论哪个参数最终都是赋值给方法中的dest变量之后,我们就可以直接在方法中提供dest参数作为我们的最终变量,但是在给参数进行赋值时还是需要带有(–)的变量,例如下面程序,我们在赋值时只能够对moo进行赋值,但是在最终的Namespace空间中的的参数是bar
1 2 3 4 5 6 7 8 9 10 11 12 13 14 import argparseparser = argparse.ArgumentParser() parser.add_argument('--moo' , dest='bar' ) a = parser.parse_args('--moo 3' .split()) print (a)parser.print_help() ''' Namespace(bar='3') # 参数空间的dest的值,即bar usage: metavar.py [-h] [--moo BAR] optional arguments: -h, --help show this help message and exit --moo BAR '''
最后我们用一个程序来加深对metavar和dest参数的理解
从输出中我们可以看出,help是对参数的简介,metavar也只起到对参数number的解释作用,并不会真正影响到我们最终得到的number变量的名字,而dest不一样,他不仅起到了对参数string的解释作用,并且最终还会替换掉string成为我们最终得到的number_no变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import argparseparser = argparse.ArgumentParser() parser.add_argument('--number' , metavar="number_yes" , help ="a number we need" ) parser.add_argument('--string' , dest='number_no' ) a = parser.parse_args('--number 1 --number 3' .split()) print (a)b = parser.parse_args('--number 1 --string 3' .split()) print (b)parser.print_help() ''' Namespace(number='3', number_no=None) Namespace(number='1', number_no='3') usage: exe.py [-h] [--number number_yes] [--string NUMBER_NO] optional arguments: -h, --help show this help message and exit --number number_yes a number we need --string NUMBER_NO '''