Python 命令行魔法手册:用argparse召唤你的参数精灵
Python的命令行参数允许在运行脚本时从外部传入数据,常用于动态配置程序行为。主要通过 sys.argv
或更高级的 argparse
模块实现。以下是详细说明和代码示例:
一、使用 sys.argv
(简单场景)
sys.argv
是一个包含命令行参数的列表,其中:
sys.argv[0]
是脚本名称sys.argv[1:]
是用户输入的参数
代码示例:
import sys
if len(sys.argv) < 2:
print("请提供参数!示例:python script.py 参数1 参数2")
else:
print("脚本名称:", sys.argv[0])
print("所有参数:", sys.argv[1:])
print("第一个参数:", sys.argv[1])
运行命令:
python script.py Hello World
输出:
脚本名称: script.py
所有参数: ['Hello', 'World']
第一个参数: Hello
二、使用 argparse
(复杂场景)
argparse
模块提供更专业的参数解析,支持类型检查、默认值、帮助信息等。
代码示例:
import argparse
# 创建解析器
parser = argparse.ArgumentParser(description="示例程序:处理命令行参数")
# 添加参数
parser.add_argument("name", help="输入你的名字(必选)")
parser.add_argument("-a", "--age", type=int, help="输入年龄(可选)")
parser.add_argument("--verbose", action="store_true", help="启用详细模式")
# 解析参数
args = parser.parse_args()
# 使用参数
print(f"你好,{args.name}!")
if args.age:
print(f"年龄:{args.age}")
if args.verbose:
print("详细模式已启用")
运行命令:
python script.py Alice -a 30 --verbose
# 或使用长选项
python script.py Alice --age 30 --verbose
输出:
你好,Alice!
年龄:30
详细模式已启用
查看帮助信息:
python script.py -h
# 输出自动生成的帮助文档:
"""
usage: script.py [-h] [-a AGE] [--verbose] name
示例程序:处理命令行参数
positional arguments:
name 输入你的名字(必选)
optional arguments:
-h, --help show this help message and exit
-a AGE, --age AGE 输入年龄(可选)
--verbose 启用详细模式
"""
关键区别
特性 | sys.argv | argparse |
---|---|---|
适用场景 | 简单参数 | 复杂参数(选项、标志、类型验证等) |
帮助文档 | 需手动实现 | 自动生成(通过 -h 查看) |
参数类型 | 全为字符串 | 支持整数、布尔值等 |
必选/可选参数 | 需手动验证 | 通过 add_argument 的 required 参数控制 |
选择方法:
- 简单参数直接使用
sys.argv
。 - 需要选项参数(如
-o
、--output
)、类型验证或帮助文档时,优先使用argparse
。
三、使用 argparse
的更多实例
以下是三个不同场景下的 argparse
代码示例,充分展示其核心特色功能:
示例 1:基础参数(类型验证 + 默认值 + 帮助文档)
import argparse
# 创建解析器
parser = argparse.ArgumentParser(
description="计算矩形的面积",
epilog="示例:python rect.py -l 5 -w 3 或 python rect.py --length 5 --width 3"
)
# 添加参数
parser.add_argument("-l", "--length", type=float, required=True,
help="矩形的长度(必选)")
parser.add_argument("-w", "--width", type=float, default=1.0,
help="矩形的宽度(默认值:1.0)")
parser.add_argument("-u", "--unit", choices=["cm", "m", "inch"], default="m",
help="单位(可选:cm/m/inch,默认:m)")
# 解析参数
args = parser.parse_args()
# 计算并输出
area = args.length * args.width
print(f"面积:{area} {args.unit}²")
运行命令:
python rect.py -l 5 -w 3 --unit cm
输出:
面积:15.0 cm²
特色功能:
- 必选参数 (
required=True
) - 类型转换 (
type=float
) - 默认值 (
default=1.0
) - 有限选项限制 (
choices=["cm", "m", "inch"]
)
示例 2:互斥参数组 + 布尔标志
import argparse
parser = argparse.ArgumentParser(description="网络请求工具")
# 互斥组:必须选择 HTTP 或 HTTPS
protocol_group = parser.add_mutually_exclusive_group(required=True)
protocol_group.add_argument("--http", action="store_true", help="使用 HTTP 协议")
protocol_group.add_argument("--https", action="store_true", help="使用 HTTPS 协议")
# 可选参数
parser.add_argument("-u", "--url", required=True, help="目标URL地址")
parser.add_argument("-v", "--verbose", action="count", default=0,
help="详细模式(-v 普通详细,-vv 高度详细)")
args = parser.parse_args()
# 组合协议
protocol = "https" if args.https else "http"
full_url = f"{protocol}://{args.url}"
# 根据详细级别输出
print(f"请求地址:{full_url}")
if args.verbose >= 1:
print("[DEBUG] 协议选择完成")
if args.verbose >= 2:
print("[TRACE] 参数校验通过")
运行命令:
python request.py --https -u "example.com/api" -vv
输出:
请求地址:https://example.com/api
[DEBUG] 协议选择完成
[TRACE] 参数校验通过
特色功能:
- 互斥参数组 (
add_mutually_exclusive_group
) - 布尔标志 (
action="store_true"
) - 计数参数 (
action="count"
实现多级详细模式)
示例 3:子命令(类似 Git 命令风格)
import argparse
# 主解析器
parser = argparse.ArgumentParser(prog="filetool")
subparsers = parser.add_subparsers(title="可用命令", dest="command", required=True)
# 子命令1:压缩
compress_parser = subparsers.add_parser("compress", help="压缩文件")
compress_parser.add_argument("input", help="输入文件路径")
compress_parser.add_argument("-o", "--output", default="output.zip",
help="输出文件名(默认:output.zip)")
compress_parser.add_argument("--level", type=int, choices=range(1, 10), default=6,
help="压缩级别 1-9(默认:6)")
# 子命令2:解压
extract_parser = subparsers.add_parser("extract", help="解压文件")
extract_parser.add_argument("archive", help="压缩文件路径")
extract_parser.add_argument("-d", "--dir", default="./",
help="解压目录(默认:当前目录)")
# 解析参数
args = parser.parse_args()
# 根据子命令执行操作
if args.command == "compress":
print(f"压缩中:{args.input} -> {args.output} (级别 {args.level})")
elif args.command == "extract":
print(f"解压:{args.archive} 到目录 {args.dir}")
运行命令:
# 压缩操作
python filetool compress data.txt -o backup.zip --level 8
# 解压操作
python filetool extract backup.zip -d ./backups
输出示例(压缩):
压缩中:data.txt -> backup.zip (级别 8)
特色功能:
- 子命令系统 (
add_subparsers
) - 不同子命令的独立参数
- 参数默认值与范围限制 (
choices=range(1, 10)
)
四、总结:argparse
核心特色
功能 | 应用场景 | 示例代码片段 |
---|---|---|
类型验证 | 确保参数格式正确(数字/路径等) | type=int , type=argparse.FileType('r') |
互斥参数 | 强制用户多选一选项 | add_mutually_exclusive_group() |
子命令系统 | 实现类似 Git 的多功能 CLI 工具 | add_subparsers() |
动态计数参数 | 实现多级详细模式 (-v, -vv, -vvv) | action="count" |
参数约束 | 限制输入范围 | choices=[...] , type=int + 范围检查 |
通过这些示例,可以快速构建灵活且用户友好的命令行工具。