argparse模块:解析命令行参数

mac2024-05-24  35

                                                                                                                                 

python标准库模块argparse用于解析命令行参数,编写用户友好的命令行界面,该模块还会自动生成帮助信息,并在所给参数无效时报错。 

 

一、基本框架

 

首先写一个简单的例子:

 

例1:

编写代码,命名为test.py

import argparse                                                                                  //第一步,导入模块。

 

if __name__ == "__main__":     parser = argparse.ArgumentParser(description="aaaa")               //第二步,创建ArgumentParser对象     parser.add_argument('--name',default='liupc')                               //第三步,添加命令行参数     args = parser.parse_args()                                                             //第四步,通过parse_args()函数获取所有参数args     name = args.name     print('Hello {}'.format(name))

打开命令行,使用python命令执行:

 

可以看到加参数和不加参数的不同处理。

 

通过这个例子可以看到,我们可以看到argparse的使用共分为一下四步:

1. 导入argpaser包

2. 通过argparse.ArgumentParser()函数创建ArgumentParser对象。

3. 调用add_argument()向ArgumentParser对象添加命令行参数信息。

4. 通过调用parse_args()来解析ArgumentParser对象中保存的命令行参数,进而使用

 

下面我们来介绍2,3,4步的用法。

 

 

二、argparse.ArgumentParser()函数

 

函数用法:

class argparse.ArgumentParser(prog=None,                                                       //程序名

                                                    usage=None,                                                    //用法信息格式

                                                    description=None,                                             //描述

                                                    epilog=None,                                                     //额外描述信息

                                                    parents=[],                                                         //共享别人的参数

                                                    formatter_class=argparse.HelpFormatter,        //显示格式

                                                    prefix_chars='-',                                                 //命令行的前缀

                                                    fromfile_prefix_chars=None,                             //从文件读入参数

                                                    argument_default=None,                                  //全局缺省值

                                                    conflict_handler=’error’,                                    //冲突处理

                                                    add_help=True,                                                 //是否增加--help选项

                                                    allow_abbrev=True)                                          //是否支持缩写

 

这个函数,我们一般也就用一下description,其他的参数都不怎么用。所以下面的解释可以不看。                                      

 

1. description

前面的例子我们使用了description,我们先来看它。description 用于展示程序的简要介绍信息,通常包括:这个程序可以做什么、怎么做。在帮助信息中 description位于用法信息与参数说明之间。

 

例1:

 

输入python test.py --help,可以看到:

 

可以看到,命令输出为三部分。第一部分是用法信息,第三部分是参数说明。而第二部分就是描述信息。

 

如果什么也不写,那肯定就什么也没有。【例2】

例2:

结果:

 

 

2. prog

这个是程序名。默认情况下, ArgumentParser对象根据sys.argv[0]的值(不包括路径名)生成帮助信息中的程序名。

 

例1:

 

 

例2:如果不写,会用默认为sys.argv[0]

//test.py

结果:

 

3. usage

默认情况下,会根据参数自动生成用法信息。

 

我们随便改一下,看看效果:

结果:

 

看来还要遵守某种格式来写。我们还是不改了,用默认的就挺好。

 

 

4. epilog

与description类似,程序的额外描述信息,位于参数说明之后

运行:

 

 

5. add_help

是否增加help选项。默认是增加的。所以上面的都可以使用-h或者--help命令。

 

我们改成false试试。

例1:

这时候,再使用-h命令就会报错。

 

 

6. prefix_chars

命令行的前缀。默认是"-",如果不想用(闲得慌),可以换成其他的。

 

例:

 

 

7.argument_default

设置一个全局的选项的缺省值,一般每个选项单独设置,所以这个参数用得少,不细说

 

 

8. conflict_handler

不建议使用。

 

9.  fromfile_prefix_chars

一般情况下,命令行参数是通过命令行直接输入的,也可以将它们存储在某个文件中,然后从文件中读取。如果你希望命令行参数可以从文件中读取,就可能用到。我们不用。

 

10. allow_abbrev

是否支持缩写。没事不要用。

 

例:

运行:

 

可以看到,虽然使用了-na=li,但也可以知道是--name=li。

 

 

11. parents

有时候,多个parsers会共享很多参数,为了避免参数的重复定义,可以定义一个包含共享参数的parent_parser。当定义需要共享参数的ArgumentParser对象child_parser时,可以通过参数parent把共享参数传递给child_parser,只需要ArgumentParser对象的参数parent=[parent_parser]即可。注意,parent参数的值是一系列父对象的列表。

 

一般不用。

 

12. formatter_class

说明显示格式。有三个允许的值:

argparse.RawDescriptionHelpFormatter            //直接输出description和epilog的原始形式(不进行自动换行和消除空白的操作)

argparse.RawTextHelpFormatter                       //直接输出description和epilog以及add_argument中的help字符串的原始形式(不

                                                                             进行自动换行和消除空白的操作)

argparse.ArgumentDefaultsHelpFormatter        //在每个选项的帮助信息后面输出他们对应的缺省值,如果有设置的话。这个最常用

 

 

三、add_argument()函数

ArgumentParser.add_argument(name or flags…

                                                   [, action]

                                                   [, nargs]

                                                   [, const]

                                                   [, default]

                                                   [, type]

                                                   [, choices]

                                                   [, required]

                                                   [, help]

                                                   [, metavar]

                                                   [, dest])

 

1.name or flags

参数有两种:可选参数和位置参数

parse_args()运行时,默认会用’-‘来认证可选参数,剩下的即为位置参数。

 

add_argument('--name')         //添加可选参数【例1】。

add_argument('--name','-n')   //意思是写--name或者-n都可以【例2】。其实写三根'-'的也可以,不过一般不这么写【例3】

add_argument('name')           //添加位置参数【例4】。位置参数如果不写会报错,可选参数如果不说明则没事【例5】【例6】

 

 

例1:添加可选参数

结果:

 

例2:

 

结果:

 

例3:

 

结果:

 

例4:

 

结果:

 

例5:

 

结果:

 

 

例6:

 

结果:

 

 

2. default

默认值。如果没有这个参数的时候,用什么值代替。【例1】

如果不写默认值,又不写这个参数的话,倒也不报错。【例2】

 

例1:

结果:

 

 

例2:

 

结果:

 

 

3. required

required=True,表示这个参数是必须的。如果没有的话,就会报错。【例1】

 

例1:

结果:

 

 

4. type

默认的参数类型是str类型。【例1】

如果你的程序需要一个整数或者布尔型参数,你需要设置type=int或者type=bool。【例2】

 

 

例1:默认参数是str类型。

运行:

 

 

例2:

运行:

 

 

5.choices

参数只能从这里面选择。

 

例1:

结果:

 

 

6. help

指定参数的说明信息。

 

例1:

结果:

 

 

7.metavar

当生成帮助信息的时候,需要指定参数的值。

对于optional参数来说,使用dest的值的大写形式作为每个参数的值。【例1】【例2】

对于positional参数来说,直接使用dest的值作为每个参数的值。【例3】【例4】

 

 

例1:对于optional参数,如果不使用metavar指定值的话,则使用大写形式作为参数的值。

 

结果:

 

结果使用了"NAMEABC"做为值。

 

 

例2:对于optional参数,使用metavar指定值。

 

结果:

 

 

例3:对于位置参数,如果不使用metavar指定值的话,则使用参数作为参数的值。

 

结果:

 

 

例4:对于位置参数,使用metavar指定值。

 

结果:

 

8. nargs

指定这个参数后面的value有多少个。

N          //参数的绝对个数,例如3。写了几个就必须是几个,多了少了都不行。【例1】【例2】【例3】

'?'         0或1个参数。【例4】【例5】

'*'         0个到多个。【例6】

'+'        1个到多个。至少一个。【例7】

 

 

例1:

 

运行1:如果写3个参数则可以执行。

 

运行2:如果多写参数则报错。

 

运行3:如果少写参数也报错。

 

运行4:如果不写参数也报错。

 

运行5:生成的帮助信息

 

 

例2:与位置参数一起使用

 

运行1:会把第4个参数自动识别为sex。

 

运行2:多了也不行

 

运行3:少了也不行

 

例3:与可选参数共同使用

 

运行:

 

例4:

 

运行1:如果写0个参数,可以。

 

运行2:如果写1个参数,可以。

 

运行3:如果写:多了,则不行

 

例5:还是不要玩这种有歧义的了。

 

运行1:

 

这个没有歧义,name有0个值。sex值为A。

 

运行2:

 

这个就不好了。如果按照A是name的值的话,sex就没值了。如果按照A是sex的值的话,name就没值了。总之以后程序不要这么写。

 

 

例6:

 

运行1:不写参数也可以

 

运行2:写多个参数也可以

 

 

例7:

 

运行1:

 

至少要写一个值。

 

运行2:

 

这就尴尬了。一个值也没写居然也可以。只能理解为-name参数没有指定required。不是必需的,所以省略可以。但是你写上了,你就不能没有值。

 

运行3:写多个值没问题。

 

 

 

 

 

 

 

 

 

 

 

 

参考:

https://blog.csdn.net/qq_36653505/article/details/83788460

https://blog.csdn.net/dulingtingzi/article/details/83861240

https://blog.csdn.net/guoyajie1990/article/details/76739977

https://blog.csdn.net/u013946404/article/details/78188266#4argumentparser%E5%AF%B9%E8%B1%A1

 

最新回复(0)