optparse 是 Python 标准库中的一个模块,用于创建用户友好的命令行界面,它能够自动处理命令行参数的解析、帮助信息的生成(-h 或 --help),以及错误提示。

尽管在 Python 3.2 之后,optparse 被 argparse 模块取代(argparse 功能更强大,使用更灵活),但 optparse 仍然被广泛使用,尤其是在维护旧项目或需要兼容旧版 Python 的场景中,理解 optparse 仍然非常有价值。
核心概念
optparse 的工作流程主要围绕以下几个核心对象:
OptionParser: 这是整个解析过程的“大脑”,你创建一个OptionParser的实例,向它添加你期望的命令行选项,然后用它来解析实际的命令行参数。Option: 代表一个具体的命令行选项。-f或--file就是一个Option,你通过add_option()方法将Option添加到OptionParser中。OptionValues(或Values): 一个简单的对象,用于存储解析后的参数值,当你调用parse_args()后,它会返回一个包含所有选项值的对象。OptionError和BadOptionError: 解析过程中如果发生错误(用户提供了未定义的选项),optparse会抛出这些异常。
基本使用步骤
使用 optparse 通常遵循以下四个步骤:
步骤 1: 创建 OptionParser 实例
from optparse import OptionParser # 创建一个解析器实例 parser = OptionParser()
步骤 2: 使用 add_option() 添加选项
这是最关键的一步。add_option() 方法非常灵活,可以定义短选项、长选项、帮助信息、默认值、参数类型等。

# 添加一个不带参数的选项(开关选项)
parser.add_option("-v", "--verbose",
action="store_true", dest="verbose",
help="Show verbose output")
# 添加一个需要参数的选项
parser.add_option("-f", "--file",
dest="filename",
help="Input file to process")
步骤 3: 解析参数
调用 parse_args() 方法来解析 sys.argv(即用户在命令行输入的内容)。
# 解析参数 # options 是一个包含选项值的对象 # args 是一个列表,包含位置参数(即非选项的参数) (options, args) = parser.parse_args()
步骤 4: 使用解析后的结果
parse_args() 返回的第一个对象 options 是一个包含你所有选项值的对象,你可以像访问普通对象的属性一样访问它们。
if options.verbose:
print("Verbose mode is on.")
if options.filename:
print(f"Processing file: {options.filename}")
print(f"Other arguments: {args}")
add_option() 的常用参数详解
add_option() 的功能非常强大,下面是一些最常用的参数:
| 参数 | 说明 | 示例 |
|---|---|---|
action |
定义当选项被遇到时应该做什么,这是最重要的参数。 | |
store |
默认值,将选项的参数值存储到 dest 指定的属性中。 |
parser.add_option("-f", "--file", action="store", dest="filename") |
store_true / store_false |
开关选项,如果选项出现,则将对应属性设为 True 或 False,不需要参数。 |
parser.add_option("-v", action="store_true") |
append |
将选项的参数值追加到一个列表中。 | parser.add_option("-l", "--lib", action="append", dest="libs") |
count |
计算选项出现的次数,常用于 -vvv 这样的调试级别。 |
parser.add_option("-v", action="count", dest="verbose") |
help |
显示在帮助信息中的文本。 | help="Show verbose output" |
dest |
指定将解析后的值存储到哪个属性名。 如果不提供,optparse 会自动从长选项名生成(--file 生成 dest="file")。 |
dest="filename" |
type |
指定选项参数的类型。optparse 会尝试转换输入,常用值:"string", "int", "float", "choice"。 |
type="int" |
default |
为选项指定一个默认值,如果用户没有提供该选项,则使用此默认值。 | default="default.txt" |
choices |
当 type 为 "choice" 时,提供一组允许的值。 |
choices=['debug', 'info', 'error'] |
metavar |
在帮助信息中显示的参数名称,通常用于美化帮助文本。 | metavar="FILE" |
nargs |
指定选项需要几个参数。 表示 0 或 1 个, 表示至少 1 个, 表示 0 个或多个,数字表示具体个数。 | nargs=2 |
完整示例
下面是一个综合性的例子,展示了 optparse 的多种用法。

脚本文件:my_script.py
from optparse import OptionParser
import sys
def main():
# 1. 创建解析器
# usage 参数可以自定义帮助信息开头的用法说明
# version 参数可以添加版本信息
parser = OptionParser(usage="%prog [options] input_file output_file",
version="%prog 1.0")
# 2. 添加选项
# 开关选项:-v, --verbose
parser.add_option("-v", "--verbose",
action="store_true",
dest="verbose",
default=False,
help="Enable verbose output")
# 带参数的选项:-o, --output
parser.add_option("-o", "--output",
dest="output_filename",
metavar="FILE",
help="Write output to FILE (default: stdout)")
# 带类型检查和默认值的选项:-n, --num
parser.add_option("-n", "--num",
dest="count",
type="int",
default=1,
metavar="N",
help="Repeat the operation N times (default: %default)")
# 互斥选项组
parser.add_option("--fast",
action="store_const",
const="fast",
dest="mode",
help="Use fast mode")
parser.add_option("--slow",
action="store_const",
const="slow",
dest="mode",
help="Use slow mode")
# 3. 解析参数
# parse_args() 会自动处理 sys.argv
(options, args) = parser.parse_args()
# 4. 处理解析结果和错误
# 检查是否提供了位置参数 (input_file 和 output_file)
if len(args) < 1:
parser.error("At least one input file must be specified.")
input_file = args[0]
# 如果没有提供 -o 选项,则使用第二个位置参数作为输出文件
output_file = options.output_filename if options.output_filename else (args[1] if len(args) > 1 else None)
# 打印解析后的值
print("--- Options ---")
print(f"Verbose: {options.verbose}")
print(f"Count: {options.count}")
print(f"Mode: {options.mode}")
print(f"Output filename: {output_file}")
print(f"Input file: {input_file}")
print("----------------")
# 在这里可以编写你的主要程序逻辑...
if options.verbose:
print("Starting the process...")
print(f"Processing '{input_file}' {options.count} time(s).")
if output_file:
print(f"Output will be saved to '{output_file}'.")
else:
print("Output will be printed to standard output.")
if __name__ == "__main__":
main()
运行示例:
-
查看帮助信息:
$ python my_script.py -h Usage: my_script.py [options] input_file output_file Options: -h, --help show this help message and exit -v, --verbose Enable verbose output -o FILE, --output=FILE Write output to FILE (default: stdout) -n N, --num=N Repeat the operation N times (default: 1) --fast Use fast mode --slow Use slow mode --version show program's version number and exit -
运行脚本并传入不同选项:
# 基本用法 $ python my_script.py data.txt --- Options --- Verbose: False Count: 1 Mode: None Output filename: None Input file: data.txt ---------------- Processing 'data.txt' 1 time(s). Output will be printed to standard output. # 使用开关选项和带参数的选项 $ python my_script.py -v -o result.txt data.txt --- Options --- Verbose: True Count: 1 Mode: None Output filename: result.txt Input file: data.txt ---------------- Starting the process... Processing 'data.txt' 1 time(s). Output will be saved to 'result.txt'. # 使用类型检查和默认值 $ python my_script.py -n 5 data.txt --- Options --- Verbose: False Count: 5 Mode: None Output filename: None Input file: data.txt ---------------- Processing 'data.txt' 5 time(s). Output will be printed to standard output. # 提供未定义的选项(会报错) $ python my_script.py --unknown data.txt my_script.py: error: no such option: --unknown
optparse vs. argparse
| 特性 | optparse |
argparse |
|---|---|---|
| Python 版本 | Python 2.3 - 3.2 (已弃用) | Python 2.7+ (推荐) |
| 子命令 | 不支持 | 支持 (非常强大) |
| 位置参数 | 支持,但功能有限 | 支持,功能更强大 (如 nargs, metavar) |
| 类型检查 | 支持 (type 参数) |
支持 (更灵活,内置类型和自定义函数) |
| 帮助信息 | 自动生成,格式固定 | 自动生成,格式更丰富,支持分组 |
| 互斥组 | 需要手动检查 | 内置支持 (add_mutually_exclusive_group) |
| 默认值 | 支持 (default 参数) |
支持 (default 参数) |
| 推荐度 | 仅用于维护旧代码 | 强烈推荐用于所有新项目 |
optparse 是一个功能完备且易于使用的命令行解析工具,对于简单的脚本来说,它非常快速和直接,由于其已处于“弃用”状态,argparse 提供了更现代、更强大的功能(尤其是子命令和更灵活的参数处理),所有新的 Python 项目都应该优先选择 argparse。
学习 optparse 仍然是有益的,因为它能帮助你理解命令行参数解析的基本概念,而这些概念在 argparse 中是相通的。
