Python 命令行魔法手册:用argparse召唤你的参数精灵

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.argvargparse
适用场景简单参数复杂参数(选项、标志、类型验证等)
帮助文档需手动实现自动生成(通过 -h 查看)
参数类型全为字符串支持整数、布尔值等
必选/可选参数需手动验证通过 add_argumentrequired 参数控制

选择方法:

  • 简单参数直接使用 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 + 范围检查

通过这些示例,可以快速构建灵活且用户友好的命令行工具。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值