1. argparse 是什么? #

对比 sys.argv

# 不推荐:手动解析
# 导入 sys 模块访问命令行参数
import sys
# 检查是否提供了足够的参数
if len(sys.argv) < 2:
    print("错误:请提供文件名")
    # 参数不足时以错误码退出
    sys.exit(1)
# 取第一个位置参数作为文件名
filename = sys.argv[1]
print(f"处理文件:{filename}")

# 推荐:argparse
# 导入 argparse 模块
import argparse
# 创建参数解析器并设置程序描述
parser = argparse.ArgumentParser(description='文件处理工具')
# 添加必需的位置参数 filename
parser.add_argument('filename', help='要处理的文件名')
# 解析命令行参数
args = parser.parse_args()
# 通过 args 对象访问解析结果
print(f"处理文件:{args.filename}")
# 运行脚本并查看自动生成的帮助信息
python script.py --help

2. 前置知识 #

类型 示例 说明
位置参数 python script.py file.txt 必须按顺序提供
短选项 python script.py -v 单字母,方便输入
长选项 python script.py --verbose 可读性好

3. 快速上手 #

# 导入 argparse 模块
import argparse

# 创建解析器,description 显示在 --help 中
parser = argparse.ArgumentParser(description='我的第一个 argparse 程序')
# 添加必需的位置参数 name
parser.add_argument('name', help='你的名字')
# 解析命令行传入的参数
args = parser.parse_args()
# 使用解析后的参数
print(f"你好,{args.name}!")
# 传入位置参数 name,输出「你好,张三!」
python hello.py 张三
# 查看帮助信息
python hello.py --help
# 缺少必需参数时会报错并显示帮助
python hello.py

4. 位置参数 #

# 导入 argparse
import argparse

# 创建文件复制工具的解析器
parser = argparse.ArgumentParser(description='文件复制工具')
# 第一个位置参数:源文件路径
parser.add_argument('source', help='源文件路径')
# 第二个位置参数:目标文件路径
parser.add_argument('dest', help='目标文件路径')
# 解析命令行参数
args = parser.parse_args()
# 输出复制信息
print(f"从 {args.source} 复制到 {args.dest}")
# 按顺序提供 source 和 dest 两个位置参数
python script.py source.txt dest.txt

5. 可选参数 #

# 导入 argparse
import argparse

# 创建解析器
parser = argparse.ArgumentParser(description='文件处理工具')
# 必需的位置参数:文件名
parser.add_argument('filename', help='要处理的文件名')
# 可选参数:详细输出开关(无需传值)
parser.add_argument('-v', '--verbose', action='store_true', help='显示详细输出')
# 可选参数:处理次数,自动转为 int,默认 1
parser.add_argument('-n', '--number', type=int, default=1, help='处理次数(默认:1)')
# 解析参数
args = parser.parse_args()

# 输出基本处理信息
print(f"处理文件:{args.filename},处理 {args.number} 次")
# 仅在指定 --verbose 时打印
if args.verbose:
    print("详细模式已启用")
# 只提供文件名,普通模式处理 1 次
python script.py file.txt
# 启用详细模式并指定处理 5 次
python script.py file.txt -v -n 5

6. 参数类型 #

# 导入 argparse
import argparse

# 创建解析器
parser = argparse.ArgumentParser(description='文件处理工具')
# 位置参数,自动转为整数
parser.add_argument('count', type=int, help='整数')
# 可选参数,自动转为浮点数
parser.add_argument('--price', type=float, help='价格')
# 位置参数,保持字符串(默认类型)
parser.add_argument('name', help='字符串(默认类型)')

args = parser.parse_args()
print(args.count)
print(args.price)
print(args.name)
# 传入整数 count 和浮点数 price
python script.py 10 --price 99.5 zhangsan
# 解析后 args.count 为 int 10,args.price 为 float 99.5,args.name为 str  zhangsan

7. 布尔参数 #

# 导入 argparse
import argparse
# 创建解析器
parser = argparse.ArgumentParser(description='文件处理工具')
# 出现 -v/--verbose 时 args.verbose 为 True
parser.add_argument('-v', '--verbose', action='store_true', help='详细输出')
# 出现 -d/--debug 时 args.debug 为 True
parser.add_argument('-d', '--debug', action='store_true', help='调试模式')

# 解析命令行参数
args = parser.parse_args()
# 根据布尔开关执行不同逻辑
if args.verbose:
    print("详细模式")
if args.debug:
    print("调试模式")
python script.py --verbose --debug

8. 多个值与 choices #

# 导入 argparse
import argparse

# 创建解析器
parser = argparse.ArgumentParser(description='文件处理工具')
# 接收一个或多个文件路径,结果存入列表
parser.add_argument('files', nargs='+', help='要处理的文件(至少一个)')

# 限制 mode 只能从预定义选项中选择
parser.add_argument('--mode', choices=['read', 'write', 'append'], default='read')

# 解析命令行参数
args = parser.parse_args()
# 打印处理文件和模式
print(f"处理文件: {args.files}")
print(f"模式: {args.mode}")

9. 常见错误与最佳实践 #

9.1 常见错误 #

错误 原因 argparse 行为
缺少位置参数 未提供必需参数 自动报错 + 显示帮助
类型不匹配 --number abc 自动报错
choices 非法 --mode delete 自动报错并列出可选值

9.2 最佳实践 #

10. 总结 #

常用 add_argument 参数

参数 说明 示例
help 帮助文字 help='输入文件'
type 类型转换 type=int
default 默认值 default=1
action 布尔开关 action='store_true'
nargs 多个值 nargs='+'
choices 限制选项 choices=['a', 'b']