Python系列教程(三十七):参数解析模块argparse

    使用python写出的脚本在运行的时候,是可以传递参数的,一般会使用sys.argv[]来接收用户传的参数。但是如果要实现类似于linux命令的,比如‘ls -l -t /etc/’这种比较复杂的选项和参数时,argv就很难实现了。
    而在python 3.2提供了一个argparse模块,可以非常方便我们实现这样的功能。

  一、argparse模块  

1、参数分类

    示例:ls -l –all /etc/

    位置参数:设定了一个位置参数,调用的时候就要传递一个实际参数,有点类似于函数的位置形参。例如这里的‘/etc’就是一个位置参数。

    选项参数:选项参数有短选项‘-’和长选项‘–’,比如这里的‘-l’是短选项参数,‘–all’是长选项参数。

2、argparse模块使用的一般步骤

    ① 定义一个参数解析器

    ② 给这个参数解析器根据需求添加位置参数和选项参数

    ③ 调用参数解析器的解析方法,获取给这个程序传递的实际值或者默认值

    ④ 拿到这些值,就可以进行给程序进行使用

3、定义一个参数解析器

    格式:argparse.ArgumentParser(prog = sys.argv[0], description, add_help=True) -> 参数解析器

    参数说明:生成一个参数解析器

    ① prog:指定程序名称,默认是脚本名称
    ② description:描述信息
    ③ add_help:增加 -h/–help 选项

#定义一个默认参数解析器
arg1 = argparse.ArgumentParser()

默认参数解析器

#定义一个自定义参数解析器
arg1 = argparse.ArgumentParser(prog='deploy',description='auto deploy tools',add_help=False)

自定义参数解析器

4、给解析器添加参数

  ① 添加位置参数 

    add_argument('arg_name', nargs=' ' , type=' ',defalut=' ' , help=' ' ) -> None

    参数说明:添加位置参数,位置参数跟添加的顺序有关,当添加了多个位置参数时,值会按顺序传递

    arg_name:参数名称,字符串类类型
    nargs:位置参数的个数,‘?’表示最多一个,‘+’表示至少一个,‘*’可有任意个,数字表示必须指定数目个
    type:命令行参数应该被转换成的类型,如,str或者int
    default:参数的默认值,一般和‘?’和‘*’配合使用,因为这两个都可以不提供参数,不提供就使用这个default值
    help:帮助信息

import argparse

#定义一个参数解析器
arg1 = argparse.ArgumentParser(prog='deploy',description='auto deploy tools')

#添加一个可以接收多个值的位置参数
arg1.add_argument('path',nargs='*',default='/etc',help='This is a path of the deploy app')

#添加一个最多可以接收一个值的位置参数
arg1.add_argument('result',nargs='?',default='success',help='The result of the deploy app')

#添加一个只能接受一个值的位置参数
arg1.add_argument('date',nargs=1,help="The date of the deploy app,Must non be none")

位置参数    

  ② 添加选项参数 

    add_argument(短选项[,长选项], action=' ',type=' ',required='',help= ) -> None

    参数说明:

    短选项,长选项:根据需要设定
    action:命令行遇到参数时的动作,默认值是 store,有以下多种类型可选

    •         store_const:表示赋值为const;

    •         store_true:表示不接受参数,存储为Bool类型的值

    •         append:将遇到的值存储成列表,也就是如果参数重复则会保存多个值

    •         append_const:将参数规范中定义的一个值保存到一个列表

    •         count:存储遇到的次数;此外,也可以继承 argparse.Action 自定义参数解析

    type:命令行参数应该被转换成的类型,如,str或者int
    required:是否必选参数
    help:帮助信息

import argparse

#定义一个参数解析器
arg1 = argparse.ArgumentParser(prog='deploy',description='auto deploy tools')

#添加位置参数
arg1.add_argument('path',nargs='*',default='/etc',help='This is a path of the deploy app')
arg1.add_argument('result',nargs='?',default='success',help='The result of the deploy app')
arg1.add_argument('date',nargs=1,help="The date of the deploy app,Must non be none")

#添加一个短选项参数
arg1.add_argument('-l',action='store_true',help= 'View details')

#添加一个长短选项参数
arg1.add_argument('-a','--all',action='store_true',help='View all')

选项参数

5、解析获取参数

    parse_args(args=None, namespache=None) -> namespace对象

  参数说明:

    args:参数列表,如果为None,表示所有定义参数所需的数据都是从外部传递进来。如果非None,表示从内部将数据传给定义的参数,需要传递一个可迭代对象。

    namespace对象:不管是通过外部传递的数据,还是内部自定义的数据,最终都会放在namespace对象上,我们可以通过namespace对象的属性获取参数数据,而且如果一旦通过内部传值的方式给参数传递数据之后,外部就算再传值也是无效的

  数据获取:

    获取位置参数的数据:位置参数的数据获取通过参数名称获取,获取的值要么是传递的值,要么是默认值,是具体的某一个值,比如:namespace.date,namespace.path。

    获取选项参数的数据:选项参数的值,如果action设置的是是“store_ture”,那么就是一个Bool值,True表示使用了这个选项,False表示没有使用这个选项,默认是False,如果是默认的action,那么就是实际传递的值,我们可以通过选项名称来获取,如果有长短选项的,就通过长选项,比如:namespace.l,namespace.all。

6、完整流程演示

  ⑴ 内部传递数据  

import argparse

#定义一个参数解析器
arg1 = argparse.ArgumentParser(prog='deploy',description='auto deploy tools')

#定义位置参数
arg1.add_argument('path',nargs='*',default='/etc',help='This is a path of the deploy app')
arg1.add_argument('result',nargs='?',default='success',help='The result of the deploy app')
arg1.add_argument('date',nargs=1,help="The date of the deploy app,Must non be none")

#定义选项参数
arg1.add_argument('-l',action='store_true',help= 'View details')
arg1.add_argument('-a','--all',action='store_true',help='View all')

#从内部给参数传递值
name1 = arg1.parse_args(['fail','2019-04-04 10:55:02'])

#打印获取到的数据
print('path:',name1.path)
print('result:',name1.result)
print('date:',name1.date)
print('-l:',name1.l)
print('-a:',name1.all)

内部传值

    结果分析:

    ① 首先看位置参数,我们知道path和result是可以不用传值的,而date是必须接受一个数据的。

    ② 然后我们在内部传参的时候,是给了2个值,那么自然而然的,按照顺序来说,就会把第一个值送给了path,第二个值给了date。

    ③ 而我们的选项参数,都没有传参,所有默认都是False

    ④ 内部传值之后,外部再怎么传值都被忽略无效,所以我们这个时候就算加上-h,也打印不出帮助信息了。

  ⑵ 外部传递数据 

import argparse

#定义一个参数解析器
arg1 = argparse.ArgumentParser(prog='deploy',description='auto deploy tools')

#定义位置参数
arg1.add_argument('path',nargs='*',default='/etc',help='This is a path of the deploy app')
arg1.add_argument('result',nargs='?',default='success',help='The result of the deploy app')
arg1.add_argument('date',nargs=1,help="The date of the deploy app,Must non be none")

#定义选项参数
arg1.add_argument('-l',action='store_true',help= 'View details')
arg1.add_argument('-a','--all',action='store_true',help='View all')

#从外部给参数传递值
name1 = arg1.parse_args()

#打印获取到的数据
print('path:',name1.path)
print('result:',name1.result)
print('date:',name1.date)
print('-l:',name1.l)
print('-a:',name1.all)

    调用测试1:没有传递任何参数

    说明:因为我们的date参数是必须接受一个值的,而且又没有默认值,所以不给传值就报错了。

调用测试1

    调用测试2:传递一个参数

    说明:传递的一个参数,给了必须接受一个值的date参数,其他都取默认值

调用测试2

    调用测试3:传递一个位置参数和一个选项参数

    说明:可以使用选项-a之后,选项参数已经变为True。

调用测试3

Jimmy's Blog ,版权所有丨如未注明,均为原创丨本网站采用BY-NC-SA协议进行授权,转载请注明转自:https://www.xjimmy.com/python-37-argparse.html

Leave a Comment