linux中使用命令或者脚本是大都可以接收参数,如

  1. ls -l /etc
  2. # /etc是位置参数
  3. # -l 是短选项

在python 3.2之后提供可参数分析的模块argparse

参数分类

  • 位置参数,如/etc
  • 选项参数,如-l表示短选项,—list表示长选项

argparse模块介绍

通过程序定义它需要的参数,然后argparse从sys.argv解析出参数,同事生成帮助和使用手册,并在传入无效参数时报出错误信息。

基本使用流程

  • 创建ArgumentParser()对象
  • 调用add_argument()方法添加参数
  • 使用parse_args()解析添加的参数

创建一个脚本:

  1. import argparse
  2. parse = argparse.ArgumentParser() # 获取参数解析器
  3. 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)