python参数解析模块_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参数是必须接受一个值的,而且又没有默认值,所以不给传值就报错了。

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值