经过配置,脚本可以接受命令行选项及参数。argparse是为解析各类参数提供支持的模块,还可以生成用法帮助信息。
创建一个ArgumentParser的实例,填入一定的参数,然后可以把可选参数(optional argument)和位置参数(positional argument)都读取出来。
使用步骤
(1)import argparse 首先导入模块
(2)parser = argparse.ArgumentParser() 创建一个解析对象
(3)parser.add_argument() 向该对象中添加你要关注的命令行参数和选项
(4)parser.parse_args() 进行解析
argparse.ArgumentParser()方法参数
description - 命令行帮助的开始文字,大部分情况下,我们只会用到这个参数
epilog - 命令行帮助的结尾文字
……
add_argument()方法参数
name or flags - 指定参数的形式,一般写两个,短参数和长参数,看下面的例子"-f", "–file"
可选的选项,位置不固定,默认是可选的
位置固定的选项,默认是必须有的
nargs - 指定这个参数后面的value有多少个,例如,我们希望使用-n 1 2 3 4,来设置n的值为[1, 2, 3, 4] #parser.add_argument("-n", "–num", nargs="+", type=int) # 这里nargs="+"表示,如果你指定了-n选项,那么-n后面至少要跟一个参数,"+"表示至少一个,"?"表示一个或0个,"*"表示0个或多个
default - 如果命令行没有出现这个选项,那么使用default指定的默认值
type - 如果希望传进来的参数是指定的类型(例如 float, int等可以从字符串转化过来的类型),可以使用 #parser.add_argument("-x", type=int) 。
choices - 设置参数值的范围,如果choices中的类型不是字符串,记得指定type #parser.add_argument("-y", choices=['a', 'b', 'd'])
required - 通常-f这样的选项是可选的,但是如果required=True那么就是必须的了 #parser.add_argument("-z", choices=['a', 'b', 'd'], required=True)
metavar - 参数的名字,在显示 帮助信息时才用到.
help - 设置这个选项的帮助信息
action - The basic type of action to be taken when this argument is encountered at the command line.
【例】opts.py内容如下,
from argparse import ArgumentParser
def main():
parser = ArgumentParser()
parser.add_argument("indent",type=int,help="indent for report")
parser.add_argument("input_file",help="read data from this file")
parser.add_argument("-f","--file",dest="filename",help="read report to this file",metavar="FILE")
parser.add_argument("-x","--xray",help="specify xray strength factor")
parser.add_argument("-q","--quiet",action="store_false",dest="verbose",default=True,
help="don't print status messages to stdout")
args = parser.parse_args()
print("arguments:",args)
main()
说明:
line4 创建一个ArgumentParser的实例
line5,6 添加两个位置参数indent和input_file,参数indent必须是能被解析为int类型的
说明:位置参数是指那些没有前缀字符(通常是"-")且必须给定的参数,是在全部可选参数(以前缀字符"-"开头)都解析完毕后输入的参数。
line7 添加一个可选的文件名参数,可以是"-f"或"--file"
line9 最后一个参数"-q"带有默认值(这里为True),当未给出本参数时将设为默认值。参数action = "store_false"则表示,如果给出了本参数,则会将False值存入目标变量中。
(1)打印帮助信息
[root@k8s-node2 ~]# python3 opts.py
usage: opts.py [-h] [-f FILE] [-x XRAY] [-q] indent input_file
opts.py: error: the following arguments are required: indent, input_file
[root@k8s-node2 ~]#
[root@k8s-node2 ~]#
[root@k8s-node2 ~]# python3 opts.py -h
usage: opts.py [-h] [-f FILE] [-x XRAY] [-q] indent input_file
positional arguments:
indent indent for report
input_file read data from this file
optional arguments:
-h, --help show this help message and exit
-f FILE, --file FILE read report to this file
-x XRAY, --xray XRAY specify xray strength factor
-q, --quiet don't print status messages to stdout
[root@k8s-node2 ~]#
(2)模块argparse将返回一个Namespace对象,其属性就包含了上面这些参数
下例给出参数-q,verbose设置为False(对应action="store_false")
[root@k8s-node2 ~]# python3 opts.py -x 100 -q -f outfile 2 inputdata
arguments: Namespace(indent=2, input_file='inputdata', filename='outfile', xray='100', verbose=False)
[root@k8s-node2 ~]#
(3)下例未给出参数-q,verbose设置为True(对应default=True)
[root@k8s-node2 ~]# python3 opts.py -x 100 -f outfile 2 inputdata
arguments: Namespace(indent=2, input_file='inputdata', filename='outfile', xray='100', verbose=True)
[root@k8s-node2 ~]#
(4)如果某个选项没有给出实参,则其值为None
例如不带可选参数 -f,则 filename=None
[root@k8s-node2 ~]# python3 opts.py -x 100 2 inputdata
arguments: Namespace(indent=2, input_file='inputdata', filename=None, xray='100', verbose=True)
[root@k8s-node2 ~]#
(5)未给出位置参数会报错
[root@k8s-node2 ~]# python3 opts.py -x 100 -f outfile 2
usage: opts.py [-h] [-f FILE] [-x XRAY] [-q] indent input_file
opts.py: error: the following arguments are required: input_file
[root@k8s-node2 ~]#
(6)可以用句点符号“.”获取这些参数的值。在opts.py的main() 中添加如下行
print("indent: ",args.indent)
print("input_file: ",args.input_file)
print("file: ",args.filename)
print("xray: ",args.xray)
print("quiet: ",args.verbose)
注意:xray没有设置dest,使用xray即可;对于file和quiet已设置dest,需要使用目标变量名
[root@k8s-node2 ~]# python3 opts.py -x 100 -f outfile 2 inputdata
arguments: Namespace(indent=2, input_file='inputdata', filename='outfile', xray='100', verbose=True)
indent: 2
input_file: inputdata
file: outfile
xray: 100
quiet: True
[root@k8s-node2 ~]#
参考资料:
python3中argparse模块详解 https://blog.csdn.net/qq_36653505/article/details/83788460
《Python 快速入门(第3版)》11.1.4 argparse模块