Python标准库中的argparse模块是开发命令行工具的首选方案,它支持自动生成帮助文档、参数类型校验、默认值设置等功能,能大幅降低命令行参数处理的复杂度。相比手动解析sys.argv的方式,argparse的代码可读性和可维护性更强,适合各类规模的命令行工具开发。

argparse基础使用流程
使用argparse模块开发命令行工具通常遵循三个核心步骤:创建解析器、添加参数、解析参数。下面通过一个简单的文件复制工具示例演示基础用法。
import argparse
# 第一步:创建参数解析器对象
parser = argparse.ArgumentParser(
description='简单的文件复制工具,支持指定源文件和目标路径'
)
# 第二步:添加参数
# 添加位置参数,必须传入
parser.add_argument('src', help='源文件路径')
parser.add_argument('dst', help='目标文件路径')
# 添加可选参数,可传可不传
parser.add_argument('-v', '--verbose', action='store_true', help='是否显示详细操作日志')
# 第三步:解析命令行参数
args = parser.parse_args()
# 使用解析后的参数
if args.verbose:
print(f'开始复制文件:{args.src} -> {args.dst}')
# 这里可以添加实际的文件复制逻辑
print(f'复制完成,源文件:{args.src},目标路径:{args.dst}')
运行上述脚本时,如果不传入任何参数或者传入-h参数,会自动生成帮助信息,展示所有参数的说明和使用方法,这是argparse自带的功能,无需额外开发。
常用参数类型与配置
位置参数与可选参数
argparse中的参数分为两类:位置参数和可选参数。位置参数不需要前缀,按照添加顺序传入即可,上面的src和dst就是位置参数;可选参数通常以-或--开头,比如上面的-v和--verbose,可以按需传入。
参数类型校验
默认情况下,argparse解析的参数都是字符串类型,我们可以通过type参数指定参数的类型,解析时会自动进行类型转换,转换失败会抛出错误并提示用户。
import argparse
parser = argparse.ArgumentParser(description='计算两个数的和')
# 指定参数类型为int,传入非数字会报错
parser.add_argument('num1', type=int, help='第一个整数')
parser.add_argument('num2', type=int, help='第二个整数')
# 可选参数指定为float类型
parser.add_argument('-r', '--ratio', type=float, default=1.0, help='结果乘以的系数,默认为1.0')
args = parser.parse_args()
result = (args.num1 + args.num2) * args.ratio
print(f'计算结果:{result}')
参数默认值与必填设置
可选参数可以通过default设置默认值,如果用户没有传入该参数,就使用默认值。如果需要将可选参数设置为必填,可以添加required=True配置。
import argparse
parser = argparse.ArgumentParser(description='用户注册工具')
parser.add_argument('-u', '--username', required=True, help='用户名,必填')
parser.add_argument('-p', '--password', default='123456', help='密码,默认为123456')
parser.add_argument('-a', '--age', type=int, help='年龄,选填')
args = parser.parse_args()
print(f'注册信息:用户名{args.username},密码{args.password},年龄{args.age if args.age else "未填写"}')
进阶功能:子命令实现
很多复杂的命令行工具支持子命令,比如git commit、git push中的commit和push就是子命令。argparse通过add_subparsers方法可以轻松实现子命令功能。
import argparse
# 创建主解析器
main_parser = argparse.ArgumentParser(description='文件管理工具')
subparsers = main_parser.add_subparsers(dest='command', help='子命令')
# 添加copy子命令
copy_parser = subparsers.add_parser('copy', help='复制文件')
copy_parser.add_argument('src', help='源文件路径')
copy_parser.add_argument('dst', help='目标文件路径')
# 添加delete子命令
delete_parser = subparsers.add_parser('delete', help='删除文件')
delete_parser.add_argument('file_path', help='要删除的文件路径')
delete_parser.add_argument('-f', '--force', action='store_true', help='强制删除,不提示')
args = main_parser.parse_args()
# 根据子命令执行不同逻辑
if args.command == 'copy':
print(f'执行复制操作:{args.src} -> {args.dst}')
elif args.command == 'delete':
if args.force:
print(f'强制删除文件:{args.file_path}')
else:
print(f'删除文件:{args.file_path},是否确认?(y/n)')
else:
main_parser.print_help()
常见问题与注意事项
- 参数名称中的
-和_是等价的,比如添加参数时写--user-name,解析后可以通过args.user_name访问。 - 如果参数值包含空格,传入时需要使用引号包裹,比如
python tool.py "hello world"。 - action参数除了
store_true,还有store_false、count等常用值,count可以用来统计参数出现的次数,比如-vvv表示日志级别为3。 - 如果需要处理复杂的参数依赖关系,可以在解析完成后自行添加校验逻辑,argparse本身不支持参数间的联动校验。
掌握argparse模块的使用方法后,就可以快速开发出功能完善、体验友好的Python命令行工具,满足日常开发、运维等各类场景的需求。