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步的用法。
函数用法:
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 //在每个选项的帮助信息后面输出他们对应的缺省值,如果有设置的话。这个最常用
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