linux中使用命令或者脚本是大都可以接收参数,如
ls -l /etc# /etc是位置参数# -l 是短选项
在python 3.2之后提供可参数分析的模块argparse
参数分类
- 位置参数,如/etc
- 选项参数,如-l表示短选项,—list表示长选项
argparse模块介绍
通过程序定义它需要的参数,然后argparse从sys.argv解析出参数,同事生成帮助和使用手册,并在传入无效参数时报出错误信息。
基本使用流程
- 创建ArgumentParser()对象
- 调用add_argument()方法添加参数
- 使用parse_args()解析添加的参数
创建一个脚本:
import argparseparse = argparse.ArgumentParser() # 获取参数解析器parse.parse_args() # 分析参数
在shell中调用此脚本
# 没有任何输出
(trydrf) localhost:py_scripts yull$ python3 dentest.py
# 默认短选项,打印帮助信息
(trydrf) localhost:py_scripts yull$ python3 dentest.py -h
usage: dentest.py [-h]
optional arguments:
-h, --help show this help message and exit
# 长选项打印帮助信息,默认存在此选项
(trydrf) localhost:py_scripts yull$ python3 dentest.py --help
usage: dentest.py [-h]
optional arguments:
-h, --help show this help message and exit
# 未定义-v参数,报错
(trydrf) localhost:py_scripts yull$ python3 dentest.py -v
usage: dentest.py [-h]
dentest.py: error: unrecognized arguments: -v
(trydrf) localhost:py_scripts yull$
上面的脚本可选参数只有—help和-h,如果需要定义其他参数,则需要调用add_argument()方法
解析器参数
在获取解析器时还可以传入解析器参数
| 参数名称 | 说明 |
|---|---|
| prog | 程序名称,缺省使用sys.argv[0] |
| add_help | 自动为解析器增加-h和—help选项,默认为True |
| description | 为程序添加功能描述 |
parse = argparse.ArgumentParser(prog='ls', add_help=True, description='list directory contents')
位置参数
shell命令中ls /etc,/etc就是位置参数
import argparse
parse = argparse.ArgumentParser(prog='ls', add_help=True, description='list directory contents')
parse.add_argument('path') # 指定位置参数
args = parse.parse_args()
print(args.path)
# output
# 如果不带参数,则会报错
(trydrf) localhost:py_scripts yull$ python3 dentest.py
usage: ls [-h] path
ls: error: the following arguments are required: path
# 带参数
(trydrf) localhost:py_scripts yull$ python3 dentest.py /etc
/etc
定义了一个为e的参数,默认必选,-h和—help为默认参数,可忽略。
可选参数
可选参数有两种方式:
- 短参数,如“-h”
- 长参数,如“—help”
import argparse
parse = argparse.ArgumentParser(prog='ls', add_help=True, description='list directory contents')
parse.add_argument("-v", "--verbosity") # 添加可选参数
args = parse.parse_args()
if args.verbosity:
print("echo verbority is {}".format(args.verbosity))
# 使用短选项
(trydrf) localhost:py_scripts yull$ python3 dentest.py -v haha
echo verbority is haha
# 使用长选项
(trydrf) localhost:py_scripts yull$ python3 dentest.py --verbosity haha
echo verbority is haha
# 不添加选项,则没有返回
(trydrf) localhost:py_scripts yull$ python3 dentest.py
# 选项为空,则会报错
(trydrf) localhost:py_scripts yull$ python3 dentest.py -v
usage: ls [-h] [-v VERBOSITY]
ls: error: argument -v/--verbosity: expected one argument
上面指定了一个短选项-v和一个长选项—verbosity,但使用-v必须制定参数值,否者就会报错。当然也可以定义不需要指定参数值,需要通过action=’store_true’来定义
import argparse
parse = argparse.ArgumentParser(prog='ls', add_help=True, description='list directory contents')
parse.add_argument("-v", "--verbosity", action='store_true')
args = parse.parse_args()
if args.verbosity:
print("echo verbority is {}".format(args.verbosity))
如此即可使用python3 dentest.py -v
参数类型
默认的参数类型为str,如果要进行数学计算,则需要在参数进行解析后进行类型转换,如果不转换则会报错
import argparse
parse = argparse.ArgumentParser()
parse.add_argument("-x", type=int, help="输入数字") # 指定类型必须为int
args = parse.parse_args()
answer = args.x + 1
print(answer)
在shell中运行脚本
# 传参为数字
(trydrf) localhost:py_scripts yull$ python3 dentest.py -x 5
6
# 传参为字符串,则报错
(trydrf) localhost:py_scripts yull$ python3 dentest.py -x as
usage: ls [-h] [-x X]
ls: error: argument -x: invalid int value: 'as'
可选值choices
如果需要限定某个值得取值范围,则可以使用choices来指定
import argparse
parse = argparse.ArgumentParser(prog='ls', add_help=True, description='list directory contents')
parse.add_argument("-x", type=int, help="输入数字", choices=[2, 3, 4]) # 限定值为2,3,4
args = parse.parse_args()
answer = args.x + 1
print(answer)
在shell中运行脚本
# 传入范围外的值
(trydrf) localhost:py_scripts yull$ python3 dentest.py -x 5
usage: ls [-h] [-x {2,3,4}]
ls: error: argument -x: invalid choice: 5 (choose from 2, 3, 4)
# 只能使用范围内的值
(trydrf) localhost:py_scripts yull$ python3 dentest.py -x 2
3
帮助信息用法
通过分组的方式将指令归类
import argparse
parse = argparse.ArgumentParser(description='canculate X to the power of Y')
group = parse.add_argument_group() # 分组,-v和-q添加到group中,x和y添加到默认parse中
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quit", action="store_true")
parse.add_argument("x", type=int, help='the base')
parse.add_argument("y", type=int, help='the exponent')
args = parse.parse_args()
answer = args.x ** args.y
if args.quit:
print(answer)
elif args.verbose:
print("{} to the power {} equals {}".format(args.x, args.y, answer))
else:
print("{}^{} == {}".format(args.x, args.y, answer))
在shell中运行脚本
$ python3 dentest.py -h
usage: dentest.py [-h] [-v | -q] x y
canculate X to the power of Y
positional arguments:
x the base
y the exponent
optional arguments:
-h, --help show this help message and exit
-v, --verbose
-q, --quit
互斥参数
在帮助信息中使用parse.add_argument_group() 方式定义了组,同样也可以定义互斥参数,使用parse.add_mutually_exclusive_group()
group = parse.add_mutually_exclusive_group() # 定义互斥参数,group下的参数只能同时出现一个
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quit", action="store_true")
参数默认值
通过参数默认值的方式,可以默认省略一些参数
import argparse
parse = argparse.ArgumentParser(prog='ls', add_help=True, description='list directory contents')
parse.add_argument("-x", type=int,
help="输入数字",
choices=[2, 3, 4],
default=2) # 定义默认值
args = parse.parse_args()
answer = args.x + 1
print(answer)
在shell中执行脚本
# 不传参数,默认值为2
(trydrf) localhost:py_scripts yull$ python3 dentest.py
3
# 传入参数
(trydrf) localhost:py_scripts yull$ python3 dentest.py -x 3
4
# 超出可选范围
(trydrf) localhost:py_scripts yull$ python3 dentest.py -x 6
usage: ls [-h] [-x {2,3,4}]
ls: error: argument -x: invalid choice: 6 (choose from 2, 3, 4)
