平时写Python脚本的同学,肯定都遇到过手动传参混乱、参数校验麻烦、别人看不懂用法的问题吧?每次写个小脚本,要么硬编码参数改来改去,要么用sys.argv裸传参,少传参数、传错类型直接报错崩溃,连个帮助提示都没有,自己用着费劲,分享给别人更是一头雾水。
Python内置标准库argparse就能完美解决所有问题,不用额外安装第三方库,10分钟就能把普通脚本改成易用的命令行(CLI)工具,并自带帮助文档、参数校验、默认值设置。今天就带大家来看看argparse。
我们写脚本传参,大概率都会用Python内置的sys模块,直接通过sys.argv读取命令行参数,代码写起来很简单:
import sys# 直接读取命令行参数,下标1是第一个参数,下标2是第二个filename = sys.argv[1]count = int(sys.argv[2])print(f"处理文件:{filename},处理数量:{count}")
这段代码看似能用,但缺点也很明显,不传参数时会直接报错,没有参数校验,没有帮助文档,也没有默认值。接下来我们看看argparse的作用,
所有argparse脚本,都从创建参数解析器(ArgumentParser)开始,这是整个工具的核心,先看最基础的模板:
import argparse# 1. 创建解析器,description写工具的功能说明parser = argparse.ArgumentParser( description="我的专属CLI工具,实现各类批量处理操作")# 2. 解析命令行参数args = parser.parse_args()
就这两行核心代码,已经自带--help/-h帮助命令了!直接运行脚本加--help,会自动生成帮助文档,清晰展示工具用法,不用自己手写任何提示,这就是argparse的强大之处。parse_args()方法是核心,它会自动读取sys.argv中的参数,完成参数解析、校验、赋值,后续所有参数配置,都围绕这个parser对象展开。
接下来我们看看三类基础参数用法。
1.位置参数(必传参数)
位置参数就是按顺序传入、必须填写的参数,不用加前缀,靠位置区分,适合必填的核心参数:
import argparseparser = argparse.ArgumentParser(description="文件处理工具")# 添加位置参数:参数名、帮助提示parser.add_argument("filename", help="输入文件的路径,必填")parser.add_argument("count", help="需要处理的条目数量,必填")args = parser.parse_args()# 直接通过args.参数名调用print(f"文件路径:{args.filename},处理数量:{args.count}")
用法:直接按顺序传参 python test.py test.txt 100,不传会直接提示错误,帮助文档里也会标注必填。
2. 可选参数(flag参数非必传)
可选参数需要加--前缀,还能设置简写(-前缀),支持默认值,属于非必填参数,日常使用频率最高:
# 可选参数,--output是全称,-o是简写,设置默认值output.txtparser.add_argument("--output", "-o", help="输出文件路径", default="output.txt")# 布尔型flag参数,传了就是True,不传就是Falseparser.add_argument("--verbose", "-v", help="开启详细日志模式", action="store_true")
用法:python test.py test.txt 100 -o result.txt -v。
action="store_true":布尔标志位,不需要传值,出现该参数即为True,不出现则为False,适合开关类功能。
3. 参数类型校验
之前用sys.argv,数字参数需要手动转int/float,还要写try-except捕获异常,argparse直接通过type参数自动校验,传错类型直接给出提示,不崩溃:
# 整数类型校验,默认值10parser.add_argument("--count", type=int, default=10, help="处理数量,整数类型")# 浮点数类型校验parser.add_argument("--rate", type=float, default=1.5, help="处理速率,浮点类型")# 限定可选值,只能传json/csv/txtparser.add_argument( "--format", choices=["json", "csv", "txt"], default="json", help="输出文件格式,仅限json/csv/txt")
如果传错参数,比如执行python test.py test.txt --count hello,argparse会直接打印错误提示
接下来我们看看多值参数与必选可选参数,
有些可选参数,虽然是--开头,但业务上要求必须传,通过required=True设置即可:
parser.add_argument("--title", required=True, help="文章标题,必传参数")
需要传多个值的时候,用nargs参数配置,支持接收一个或多个值:
# nargs="+":至少传一个值,不传报错parser.add_argument("--tags", nargs="+", help="至少一个标签,空格分隔")# nargs="*":传0个或多个值,不传也可以parser.add_argument("--labels", nargs="*", help="0个或多个标签,空格分隔")
解析后直接是Python列表,可直接遍历使用,不用手动拆分参数。
除了action="store_true",还有store_false,适合反向开关:
# 传--dry-run则为True,模拟执行不写入文件parser.add_argument("--dry-run", action="store_true", help="模拟执行,不实际操作")# 传--no-color则color为False,关闭彩色输出parser.add_argument("--no-color", action="store_false", dest="color", help="关闭彩色输出")
最后,本次内容我们搞定了argparse的核心基础,从sys.argv的痛点,到ArgumentParser的创建、位置参数、可选参数、类型校验、多值参数,这些基础用法已经能满足80%的日常脚本需求。下次我们看看更高级的内容。