跳到主要内容

argparse

argparse 把命令行文本解析为 Python 对象,并自动生成帮助信息。它适合脚本、批处理工具和命令行应用。

最小程序​

import argparse

parser = argparse.ArgumentParser(description="统计文件行数")
parser.add_argument("path", help="要读取的文件")
parser.add_argument("-v", "--verbose", action="store_true", help="显示详细信息")
args = parser.parse_args()
print(args.path, args.verbose)

运行 python count.py -h 会显示用法、参数说明和示例。位置参数按顺序传入,选项参数通常使用 --长名称,可同时提供短名称。

类型、默认值和选择​

parser.add_argument("-n", "--number", type=int, default=10)
parser.add_argument("--format", choices=["text", "json"], default="text")
parser.add_argument("--ratio", type=float, required=True)
parser.add_argument("files", nargs="+", help="至少一个文件")

type 在解析阶段转换并校验;转换失败会得到友好的错误。常见 nargs:? 可选一个、* 任意多个、+ 至少一个。required=True 适用于选项参数,但不宜滥用,优先设计合理默认值。

布尔开关与互斥参数​

parser.add_argument("--dry-run", action="store_true")
parser.add_argument("--tag", action="append", default=[])
mode = parser.add_mutually_exclusive_group(required=True)
mode.add_argument("--fast", action="store_true")
mode.add_argument("--safe", action="store_true")

store_true 出现即为 True;append 可重复传入并收集列表。互斥组保证用户不能同时选择冲突选项。

子命令​

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest="command", required=True)

add = subparsers.add_parser("add", help="新增记录")
add.add_argument("text")
list_cmd = subparsers.add_parser("list", help="列出记录")
args = parser.parse_args()
if args.command == "add":
print(f"新增:{args.text}")
else:
print("列出记录")

大型程序可为每个子命令绑定函数:add.set_defaults(func=handle_add),解析后调用 args.func(args),避免堆积 if 分支。

自定义校验与配置建议​

def positive(value):
number = int(value)
if number <= 0:
raise argparse.ArgumentTypeError("必须是正整数")
return number

parser.add_argument("--workers", type=positive, default=1)

解析器默认遇到错误会打印帮助并以状态码 2 退出。库代码不要直接调用 parse_args(),应把解析放在 main() 中,便于测试;需要解析列表时使用 parse_args(["..."])。