optparse 模块 - 命令行选项解析
Python optparse 模块详解 - 用于解析命令行选项和参数的标准库工具,已被 argparse 取代但仍在维护
optparse 模块 - 命令行选项解析
📝 概述
optparse 模块是 Python 标准库中用于处理命令行选项和参数的工具。它采用预先定义好的选项来解析命令行参数,可以方便地为脚本添加命令行接口。虽然在 Python 2.7 之后被 argparse 模块取代,但 optparse 仍在维护并广泛使用。
optparse 提供了比 getopt 更强大和易用的功能,可以自动生成标准的、符合 Unix/Posix 规范的命令行说明。
🎯 学习目标
- 理解 optparse 模块的基本概念和用途
- 掌握 OptionParser 对象的创建和使用
- 学会添加命令行选项(add_option)
- 了解各种 action 类型和参数配置
- 掌握选项解析和错误处理
- 能够构建完整的命令行工具
📋 前置知识
- Python 基础语法和模块导入
- 命令行基础概念
- 字典和列表的使用
- 异常处理机制
🔍 详细内容
基本概念
optparse 主要用来为脚本传递命令参数,采用预先定义好的选项来解析命令行参数。通过实例化一个 OptionParser() 对象,可以定制程序的参数选项控制。
创建 parser 实例
每个 parser 实例代表一类命令实例。例如 -f 是文件命令中的一个 option,它属于文件 parser 对象。
from optparse import OptionParser
parser = OptionParser()
基础用法示例
# coding=utf-8
"""
Python 有两个内建的模块用于处理命令行参数:
一个是 getopt,只能简单处理命令行参数;
另一个是 optparse,它功能强大,而且易于使用,可以方便地生成标准的、符合Unix/Posix 规范的命令行说明。
"""
import optparse
usage = "Usage: %prog [options] arg1 arg2 ..."
parser = optparse.OptionParser(usage, version="%prog 1.0")
options, args = parser.parse_args()
"""
解释:
optparse.OptionParser()对象中的参数中的:%prog 代表当前脚本名字即os.path.basename(sys.argv[0])
options,args=parser.parse_args(),optparse.OptionParser()对象实例调用parse_args()方法后即可解析脚本输入的参数值;
返回值:options是一个包含了option值的对象,args是一个位置参数的列表。
parse_args()方法可以接受命令中输入的参数,也可以接受一个列表List[],parse_args(list)
"""
运行结果:
E:\HDCZU_Test\Test>python py15.py -h
Usage: py15.py [options] arg1 arg2 ...
Options:
--version show program's version number and exit
-h, --help show this help message and exit
添加选项
add_option 的参数
parser.add_option("-f", "--file", action="store", type="string", dest="filename")
参数说明:
- 短参数名(-f):表示短参数名(后面空格或不用空格接参数属性值)
- 长参数名(–file):表示长参数名(后面空格或=号接参数属性值)
- action:告诉 optparse 遇到参数应该按照 add_option 时定义的来使用
action="store":用户必须给出一个明确的参数值,并将参数值保存到 dest 定义的变量名中action="store_true":用户不需要给出参数值,将 bool 值 True 保存在 dest 定义的变量名中action="store_false":用户不需要给出参数值,将 bool 值 False 保存在 dest 定义的变量名中
- dest:定义一个变量名用来接收前面的长短参数名的参数值,即可调用 options.filename 来获取长短参数名的参数值
- type:定义前面长短参数名的参数值的类型,必须是字符串(这里可以是:string, int, num, float 等类型)
- metavar:当用户查看帮助信息时,如果没有定义 metavar 的值,那么显示的帮助信息中长短参数名后面默认带上 dest 所定义的变量名;如果定义了 metavar 的值,那么显示的帮助信息中长短参数名后面就带上 metavar 定义的值
- default:如果长短参数名未设置参数属性值,则使用默认值代替,前提是 action 未定义或 action 只能定义为 store_true/store_false
- help:仅显示帮助信息中的语句提示信息
语法格式
基本选项添加示例
import optparse
usage = "Usage: %prog [options] arg1 arg2 ..."
parser = optparse.OptionParser(usage, version="%prog 1.0")
# 自定义可以解析的参数名
parser.add_option("-f", "--file", action="store", dest="filename", type="string", metavar="FILE", help="write output to file")
options, args = parser.parse_args()
print("options :", options)
print(options.filename)
print("args :", args)
运行结果:
E:\HDCZU_Test\Test>python py15.py -f dchuoth
options : {'filename': 'dchuoth'}
dchuoth
args : []
多选项配置示例
import optparse
usage = "Usage: %prog [options] arg1 arg2 ..."
parser = optparse.OptionParser(usage, version="%prog 1.0")
# 自定义可以解析的参数名
parser.add_option("-f", "--file", action="store", dest="filename", type="string", metavar="FILE", help="write output to file")
parser.add_option("-u", "--user", action="store", dest="username", type="string", metavar="USER", help="write user to username")
parser.add_option("-v", default="1.2", help="print version")
# 设置默认值也可以这样:parser.set_defaults(v="1.2")
options, args = parser.parse_args()
print("options :", options)
print(options.filename)
print(options.username)
print(options.v)
print("args :", args)
运行结果:
E:\HDCZU_Test\Test>python py15.py -fdchuoth -uhzhu
options : {'filename': 'dchuoth', 'v': '1.2', 'username': 'hzhu'}
dchuoth
hzhu
1.2
args : []
参数说明
action 参数详解
| action | 说明 |
|---|---|
| store | 告诉 optparse 按照 add_option 时定义的那样解析(默认值) |
| store_true | option 后面有参数那么选项值为 True |
| store_false | option 后面有参数那么选项值为 False |
type 参数
指定选项值的类型,可选值:
- string(默认)
- int
- float
- choice
dest 参数
指定选项名(也就是 options 字典中的键值)
default 参数
当没有参数时默认给选项字典赋值
help 参数
帮助信息提示,添加了 usage 信息
USAGE = "one two three"
parser = OptionParser(USAGE)
parser.add_option("-f", "--file", action="store", type="string", dest="filename", default="hahaha", help="no help")
parser.print_usage()
parser.print_help()
返回值
parse_args() 方法返回一个元组:
- options:包含选项值的对象,可以通过 options.选项名 访问
- args:位置参数的列表,除了选项后跟着的参数外都是参数列表中的参数
💡 实际应用
基础用法
from optparse import OptionParser
parser = OptionParser()
parser.add_option("-f", "--file")
(options, params) = parser.parse_args()
print(options)
print(params)
高级用法
完整的选项配置
import optparse
usage = "Usage: %prog [options] arg1 arg2 ..."
parser = optparse.OptionParser(usage, version="%prog 1.0")
# 文件选项
parser.add_option("-f", "--file", action="store", dest="filename",
type="string", metavar="FILE", help="write output to file")
# 用户选项
parser.add_option("-u", "--user", action="store", dest="username",
type="string", metavar="USER", help="write user to username")
# 版本选项
parser.add_option("-v", default="1.2", help="print version")
# 布尔选项
parser.add_option("-b", action="store_true", dest="verbose")
parser.add_option("-d", action="store_false", dest="verbose")
options, args = parser.parse_args()
print("options :", options)
print("filename:", options.filename)
print("username:", options.username)
print("version:", options.v)
print("verbose:", options.verbose)
print("args :", args)
# 错误处理
if not options.verbose:
parser.error("verbose must be true")
实际案例
文件处理工具
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import optparse
import sys
import os
def main():
usage = "Usage: %prog [options] input_file"
parser = optparse.OptionParser(usage, version="%prog 1.0")
parser.add_option("-o", "--output", dest="output_file",
help="输出文件路径", metavar="FILE")
parser.add_option("-v", "--verbose", action="store_true",
dest="verbose", default=False,
help="显示详细信息")
parser.add_option("-q", "--quiet", action="store_false",
dest="verbose", help="静默模式")
(options, args) = parser.parse_args()
# 检查参数
if len(args) != 1:
parser.error("需要指定一个输入文件")
input_file = args[0]
if not os.path.exists(input_file):
parser.error("输入文件不存在: %s" % input_file)
# 处理文件
if options.verbose:
print("处理文件: %s" % input_file)
# 文件处理逻辑...
if options.output_file:
if options.verbose:
print("输出到: %s" % options.output_file)
else:
if options.verbose:
print("输出到标准输出")
if __name__ == "__main__":
main()
⚠️ 注意事项
- 废弃状态:optparse 在 Python 2.7 之后被 argparse 取代,新项目建议使用 argparse
- 兼容性:optparse 仍在维护,保持向后兼容
- parse_args()参数:可以接受命令行参数,也可以接受一个列表
parse_args(list) - %prog 占位符:在 usage 和 version 中,%prog 会被替换为当前脚本名
- 错误处理:使用
parser.error("error message")来处理错误 - 选项顺序:选项可以出现在位置参数的任何位置
- 参数格式:短选项可以连写(如
-fdchuoth),长选项用等号连接(如--file=filename)
🔗 相关内容
📚 扩展阅读
🏷️ 标签
命令行 选项解析 参数处理 脚本 工具
最后更新: 2024-12-19
作者: Python教程
版本: 1.0
讨论与反馈
欢迎在下方留言讨论,分享你的学习心得或提出问题。评论基于GitHub Issues,需要GitHub账号。