Python argparse 入门:把脚本变成“命令行工具”,并用 .sh 批量跑实验
在写 Python 脚本时,经常会有以下需求:
- 想在运行脚本时传入不同参数(比如
--lr 0.001 --epochs 20) - 希望用户输入错误时能有清晰提示
- 希望自动生成
--help帮助文档 - 想批量对比多组参数的运行结果(用
.sh一键跑一堆实验)
argparse 就是 Python 标准库中专门解决这些问题的命令行参数解析工具。➡️
1. argparse 是干什么的?
argparse 的作用可以概括为一句话:
把命令行里的一串字符串参数,解析成 Python 里可直接使用的变量,并自动提供帮助信息和输入校验。
如果希望用户在命令行里像下面这样带参数运行:
1 | |
argparse 就负责把 --epochs 20、--lr 0.001 等解析成 Python 变量:
args.epochs == 20(整数)args.lr == 0.001(浮点数)args.device == "cuda"(字符串,并可限制范围)
并且支持查看帮助:
1 | |
自动生成用法说明和参数解释。
2. 最小例子:读取一个位置参数(必须提供)
下面的脚本要求用户必须提供一个名字:
1 | |
上面四个环节就是使用 argparse 的基本流程。
2.1 ArgumentParser(...):创建解析器对象 parser
1 | |
ArgumentParser是 argparse 提供的核心类description会显示在--help的顶部
单双引号
""或''都可以,Python 中几乎等价。差别只在转义方便性,比如字符串里本身有单引号时:
"I'm ok"方便'I\'m ok'也行但要转义
2.2 add_argument(...):声明一个参数的“规则”
在这里定义参数名、类型、默认值、是否必填、帮助说明等。
位置参数(不带 --):
1 | |
可选参数(带 --):
1 | |
2.3 parse_args():真正去“读取并解析命令行”
这一行会从命令行读取输入并解析:
1 | |
解析结果 args 是一个对象,用 args.xxx 访问对应参数。
没有这行,前面只是“定义规则”,还没有真正读取命令行。
2.4 运行方式
1 | |
输出:
1 | |
如果只运行:
1 | |
会报错:
1 | |
[-h]:表示 可选参数-h(或--help)- 方括号
[...]在usage里表示可选
- 方括号
name:表示必填的位置参数- 没有方括号包起来,说明它必须提供
- 位置参数的特点是:不写
--name这种前缀,直接按顺序给值
- 运行
hello.py时,可以选择加-h/--help,但必须提供一个name。
如果运行:
1 | |
会输出:
1 | |
- 显示完就退出,不会执行
print(f"Hello...")- 运行
python hello.py --help Alice之后命令行输出与上面一致,不会打印。
- 运行
--help是为了让用户快速知道怎么用,- 能看到自动生成的参数说明,避免“必须看源码才能知道怎么传参”。
hello.py中的help=里面的内容也可以写中文- 只要终端支持 UTF-8(Linux/macOS 一般没问题;Windows 建议用 Windows Terminal / PowerShell)。
3. 让脚本“无参也能跑”:给参数默认值
argparse 的目标并不是“只写 python hello.py 就能跑”。实际上关键在于:怎么设计参数。
3.1 位置参数变为可选(nargs + default)
1 | |
现在:
python hello.py→Hello, World!python hello.py Alice→Hello, Alice!
nargs:参数个数规则
"?":可有可无(适合位置参数可选化)"*":可多个"+":至少一个
3.2 使用可选参数 --name
1 | |
现在:
python hello.py→Hello, World!python hello.py --name Alice→Hello, Alice!
也可以写:
"-n"- 但
"--name"可读性更强
4. 经典参数能力:type、default、required、choices、flag
1 | |
运行:
1 | |
要点总结:
type=int/float:自动类型转换default=...:不提供就用默认值choices=[...]:限制合法取值,非法取值会报错并提示合法选项action="store_true":布尔开关参数,有--verbose就打印更详细信息,否则不打印
5. 用 .sh 脚本批量运行多组参数(做实验对比非常常用)
.sh 是 Shell 脚本文件(通常在 Linux/macOS 或 Windows 的 WSL/Git Bash中使用)
用途:来把一堆命令写进文件,一键执行。
5.1 最简单:运行一次
创建 run_once.sh:
1 | |
运行:
1 | |
(在 Linux/macOS 上也可以 chmod +x run_once.sh 后用 ./run_once.sh 运行。)
5.2 批量对比:循环跑多个参数组合
创建 grid_search.sh:
1 | |
也可以只打印将要执行的命令(不执行):
1 | |
运行:
1 | |
说明:
epochs和lr是 bash 变量"$epochs"代表取出变量值并安全传入(推荐加引号)- bash 语法:
$epochs会被替换为变量epochs的值
- bash 语法:
#!/usr/bin/env bash:shebang / hashbang,用/usr/bin/env去在PATH环境变量里找到bash#(hash)!(bang)- 使用
bash grid_search.sh运行脚本时,已经明确解释器是bash,此时 shebang 不是必须的。
6. 最佳实践:让 argparse 结构更清晰
当参数变多时,推荐把 parser 单独封装:
1 | |
这样主逻辑更干净、便于维护。
7. 你学会了什么?
ArgumentParser(...):创建命令行解析器add_argument(...):定义参数规则(位置参数/可选参数)parse_args():读取命令行并解析成args.xxx--help自动生成帮助信息,help=可以写中文.sh脚本可以一键批量跑多组参数,适合实验对比与复现实验