python 内建模块学习之 optparse

204 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

1. wiki

optparse 是 python 内建模块,用于处理命令行参数。
使用时可以利用长短选项就行优雅传参,如

<yourscript> -name hello --file=test.txt --quiet
<yourscript> -h

2. 使用

2.1. 初始化 parser = OptionParser()

初始化一个 OptionParser ,其有 2 个参数

parser = OptionParser(usage='Usage: %prog [options] arg1 arg2 ...',version='%prog 1.0')
  • usage : 定义使用方法,会展示在 --help 首行
  • version : 用来显示当前脚本的版本

其还有一些预置参数,方便调用

  • %prog : 等同于os.path.basename(sys.argv[0]),即当前运行的脚本的名字

2.2. 添加参数 parser.add_option()

向该实例中添加选项,常用的有 7 个参数

parser.add_option('-f','--file',
                  dest='filename',
                  action='store',
                  metavar='FILE',
                  default='test.txt',
                  type=str,
                  help='File that needed handled')
  • -f,--file : 表示一个是短 option 一个是长 option,有 1 个即可
  • dest : 将 option 后面的值保存到该选项后的变量中,之后使用 . 调用
  • action : 表示将 option 后面的值如何处理,常用的有 store,store_true,store_false
    • store : 默认类型,将 option 后值存储到 dest 后的参数中,可以使用 option.filename 调用
    • store_true : 无需提供 option 后的值,会保存布尔值 true 到 dest 指定的变量中
    • store_false : 无需提供 option 后的值,会保存布尔值 false 到 dest 指定的变量中
  • metavar : 在显示帮助时显示,未指定时,会显示 dest 所指定的变量名
  • default : 该 option 的默认值,如果参数后面没有指定值,将默认为变量 default 的值
  • help : 显示的帮助提示信息
  • type : 表示这个参数值的类型必须是 str 字符型,如果是其他类型那么将强制转换为 str(可能会报错)

2.3. 添加参数分组 group = OptionGroup()

可选,有时候为将参数进行分类,此时可调用 OptionGroup 类,定制以组显示的选项参数,其有 3 个参数

group = optparse.OptionGroup(parser, title, description=None)
  • parser : OptionParser 初始化后的实例
  • title : 组名,会在组首行打印
  • description : 组的详细描述

使用方法为

  1. group.add_option() : 向组内添加选项,参数与 parser 相同
  2. parser.add_option_group(group) : 将组注册到 OptionParser 实例中

2.4. 解析参数值 parser.parse_args()

调用解析 parse_args() 解析后,返回的 2 个值

options,args = parser.parse_args()
  • options : 是一个对象(optpars.Values),保存有命令行参数值。只要知道 dest 参数名,就可以访问其对应的值,如 options.filename
  • args : 是一个位置参数的列表

3. 实战

下述为使用实例

# coding = utf-8

from optparse import OptionParser
from optparse import OptionGroup

# 1. 初始化之
parser = OptionParser(usage='Usage: %prog [options] arg1 arg2 ...',version='%prog 1.0')

# 2. 自定义 4 个选项
parser.add_option('-f','--file',
                  action='store',dest='filename',type=str,
                  metavar='FILENAME',help='File that needed handled.')
parser.add_option('-m','--mode',
                  default='standalone',
                  help='Interaction mode:local,standalone,yarn,k8s.')
parser.add_option('-v','--verbose',
                  action='store_true',dest='verbose',default=True,
                  help='Show details.')
parser.add_option('-q','--quiet',
                  action='store_false',dest='verbose',
                  help="Not show details.")

# 3. 定制以组显示的 option,并注册,以下定义了两个组
# 3.1
group = OptionGroup(parser,'Dangerous Options',
                    'Caution: use these options at your own risk.')
group.add_option('-g',action='store_true',help='Group option.')
# 将组注册到 OptionParser 实例中
parser.add_option_group(group)

# 3.2
group = OptionGroup(parser,'Debug Options')
group.add_option('-d','--debug',action='store_true',
                 help='Print debug information.')
group.add_option('-s','--sql',action='store_true',
                 help='Print all SQL statements executed')
group.add_option('-e',action='store_true',help='Print every action done')
# 将组注册到 OptionParser 实例中
parser.add_option_group(group)

# 4. 解析脚本输入的参数值
(options,args) = parser.parse_args()

当使用命令行执行 python.exe demo_optparase.py --help ,或在代码中调用 parser.print_help(),显示结果如下:

Usage: demo_optparase.py [options] arg1 arg2 ...

Options:
  --version             show program's version number and exit
  -h, --help            show this help message and exit
  -f FILENAME, --file=FILENAME
                        File that needed handled.
  -m MODE, --mode=MODE  Interaction mode:local,standalone,yarn,k8s.
  -v, --verbose         Show details.
  -q, --quiet           Not show details.

  Dangerous Options:
    Caution: use these options at your own risk.

    -g                  Group option.

  Debug Options:
    -d, --debug         Print debug information.
    -s, --sql           Print all SQL statements executed
    -e                  Print every action done