argparse模块用法
-
-
- 示例1
- 常用命令行调用示例
- 关键特点
- 示例2
- 特性说明:
- 使用场景:
- 命令行使用示例:
- 在代码中的使用方式:
- 相关参数对比:
- 扩展建议:
-
argparse 模块主要用法如下:
| 基础设置 | ArgumentParser() | 创建解析器对象 | parser = argparse.ArgumentParser(description="示例程序") |
| add_argument() | 添加参数定义 | parser.add_argument("filename") | |
| 参数类型 | 位置参数 | 必须提供的参数,按顺序解析 | parser.add_argument("input_file") |
| 可选参数 | 以 – 或 — 开头,顺序任意 | parser.add_argument("-v", "–verbose") | |
| 参数属性 | type | 指定参数类型(如 int, float, str) | type=int |
| default | 设置默认值 | default=1 | |
| choices | 限制参数值的可选范围 | choices=["A", "B", "C"] | |
| required | 是否必须提供(针对可选参数) | required=True | |
| help | 参数的帮助说明 | help="输入文件名" | |
| 特殊功能 | action="store_true" | 当参数出现时设为 True,否则为 False | action="store_true" |
| nargs | 指定参数接收的值的数量:?(0或1个), *(0或多个), +(1或多个) | nargs="+" | |
| dest | 解析结果中使用的属性名 | dest="output" | |
| 解析与使用 | parse_args() | 解析命令行参数,返回命名空间对象 | args = parser.parse_args() |
| 访问参数值 | 通过属性名访问参数值 | print(args.filename) |
示例1
import argparse
# 1. 创建解析器
parser = argparse.ArgumentParser(description="文件处理工具")
# 2. 添加参数
parser.add_argument("input", help="输入文件路径") # 位置参数
parser.add_argument("-o", "–output", help="输出文件路径", default="output.txt") # 可选参数
parser.add_argument("-n", "–number", type=int, help="重复次数", default=1, choices=[1,2,3])
parser.add_argument("-v", "–verbose", action="store_true", help="显示详细输出")
# 3. 解析参数
args = parser.parse_args()
# 4. 使用参数
print(f"输入文件: {args.input}")
print(f"输出文件: {args.output}")
if args.verbose:
print("详细模式已开启")
常用命令行调用示例
# 基本用法
python script.py data.txt
# 使用可选参数
python script.py data.txt -o result.txt -n 2
# 启用标志参数
python script.py data.txt -v
# 查看帮助
python script.py -h
关键特点
这是一个很好的 argparse 使用示例!让我详细解析这个参数定义:
示例2
parser.add_argument("–log_all",
action="store_true",
help="flag to log in all processes, otherwise only in rank0",
)
特性说明:
| 参数名 | –log_all(长格式) |
| action | store_true – 标志型参数 |
| 作用 | 控制分布式训练中的日志记录行为 |
| 默认行为 | 不指定该参数时为 False |
使用场景:
通常在分布式训练(如使用 PyTorch DDP)中:
- 未指定 –log_all:只在 rank0 进程记录日志(避免重复输出)
- 指定 –log_all:所有进程都记录日志(用于调试)
命令行使用示例:
# 默认情况:只在 rank0 记录日志
python train.py –data_dir ./data –epochs 10
# 启用所有进程记录日志
python train.py –data_dir ./data –epochs 10 –log_all
# 等效写法
python train.py –data_dir ./data –epochs 10 –log_all=true
在代码中的使用方式:
import argparse
import torch.distributed as dist
# 解析参数
parser = argparse.ArgumentParser()
parser.add_argument("–log_all", action="store_true",
help="flag to log in all processes, otherwise only in rank0")
args = parser.parse_args()
# 分布式训练中根据参数控制日志
def log_message(message):
if args.log_all:
# 所有进程都打印
print(f"[Rank {dist.get_rank()}] {message}")
else:
# 只在 rank0 打印
if dist.get_rank() == 0:
print(message)
# 使用示例
log_message("开始训练…")
相关参数对比:
# 不同 action 类型的对比
parser.add_argument("–verbose", action="store_true") # 标志,默认为 False
parser.add_argument("–quiet", action="store_false") # 标志,默认为 True
parser.add_argument("–level", action="store_const", const=10) # 存储固定值
扩展建议:
如果需要更精细的控制,可以考虑:
# 方案1:三态选择
parser.add_argument("–log_level",
choices=["none", "rank0", "all"],
default="rank0",
help="日志记录级别:none(不记录), rank0(仅rank0), all(所有进程)")
# 方案2:数值控制
parser.add_argument("–log_freq",
type=int,
default=10,
help="每多少步记录一次日志(仅在rank0生效,除非指定–log_all)")
这种 store_true 类型的参数特别适合用于开关/标志功能,代码中只需检查 if args.log_all: 即可。



