args传参
完整代码:
# 导入 argparse 模块,它提供了一种方式来处理命令行参数
import argparse
# 创建 ArgumentParser 对象,这个对象将用于定义和解析命令行参数
parser = argparse.ArgumentParser()
# 添加一个字符串类型的参数 SERIAL_PORT1,用于指定第一个报警器的串口号
# 如果没有在命令行中指定,则使用默认值 'COM5'
# 当用户使用 -h 或 --help 选项时,将显示此参数的帮助信息
parser.add_argument("--SERIAL_PORT1", type=str, default='COM5', help='第一个报警器的串口号')
# 添加一个整数类型的参数 area_thred,用于设定物体面积的阈值
# 默认值为 1500,如果没有在命令行中指定,则使用这个默认值
parser.add_argument("--area_thred", type=int, default=1600, help='物体面积的阈值')
# 添加一个浮点数类型的参数 confid_level,用于设定识别的置信度
# 默认值为 0.8,如果没有在命令行中指定,则使用这个默认值
parser.add_argument("--confid_level", type=float, default=0.8, help='识别的置信度')
# 添加一个整数类型的参数 aaa,默认值为 100
# 如果没有在命令行中指定,则使用这个默认值
parser.add_argument("-aaa", type=int, default=100)
# 添加一个整数类型的参数 bbb,默认值为 10
# 如果没有在命令行中指定,则使用这个默认值
parser.add_argument('-b',"--bbb", type=int, default=10)
# 使用 parse_args() 方法解析命令行参数,返回的 Namespace 对象将包含所有的参数值
# 如果参数在命令行中被指定,则使用指定的值;否则使用默认值
opt = parser.parse_args()# 从 opt 对象中获取参数 aaa 的值
aa = opt.aaa
# 从 opt 对象中获取参数 bbb 的值
bb = opt.bbb
# 打印参数 aaa 和 bbb 的和
print(aa + bb)
核心功能概述
此代码演示如何使用 Python 标准库 argparse
模块实现以下功能:
定义并解析命令行参数
支持多种数据类型(字符串/整数/浮点数)
为参数设置默认值与帮助文档
通过不同形式指定参数(长短选项混合)
最终获取参数值并进行简单运算
模块导入与初始化
import argparse # ① 导入用于处理命令行参数的标准库模块
parser = argparse.ArgumentParser() # ② 创建参数解析器对象
关键点解析:
argparse
是 Python 内置模块,无需第三方依赖ArgumentParser()
创建核心解析器对象,后续所有参数定义都基于此对象操作
参数定义详解
字符串类型参数 (带描述符)
parser.add_argument("--SERIAL_PORT1", type=str, default='COM5', help='第一个报警器的串口号')
组成部分 | 说明 |
---|---|
"--SERIAL_PORT1" | 参数的长名称(必须在命令行中使用 --SERIAL_PORT1 指定) |
type=str | 限定参数值为字符串类型 |
default='COM5' | 未提供该参数时的默认值 |
help='...' | 当用户输入 -h 或 --help 时显示的帮助信息 |
使用示例:
script.py --SERIAL_PORT1 COM7
→ 覆盖默认值
script.py
→ 使用默认值 COM5
整数类型参数 (纯数字阈值)
parser.add_argument("--area_thred", type=int, default=1600, help='物体面积的阈值')
特别注意:
虽然变量名拼写为 area_thred
(疑似应为 threshold
),但在代码中保持一致即可正常运行。实际使用时建议修正拼写错误。
浮点数类型参数 (置信度设置)
parser.add_argument("--confid_level", type=float, default=0.8, help='识别的置信度')
典型应用场景:
机器学习模型推理时常用此类参数控制预测结果的可信度过滤阈值。
整数类型参数 (多形式定义)
# 方式一:仅短选项
parser.add_argument("-aaa", type=int, default=100)# 方式二:短选项+长选项组合
parser.add_argument('-b', "--bbb", type=int, default=10)
特性 | -aaa | -b/--bbb |
---|---|---|
最短调用形式 | -aaa 200 | -b 30 或 --bbb 30 |
长选项优势 | 无 | --bbb 比 -b 更具可读性 |
推荐实践 | 重要参数建议添加长选项 | ✔️ 本例中 --bbb 符合最佳实践 |
参数解析与值获取
opt = parser.parse_args() # ⑥ 解析命令行参数,返回命名空间对象
aa = opt.aaa # ⑦ 通过属性访问参数值
bb = opt.bbb # ⑧ 同上
print(aa + bb) # ⑨ 输出两参数之和
关键机制解析:
parse_args()
:- 自动匹配命令行输入与预定义的参数列表
- 返回
Namespace
对象(类似字典,可通过.
访问属性) - 优先级:命令行参数 > 默认值
属性访问规则:
- 参数名称自动转为
Namespace
的属性名(区分大小写) - 例:
--SERIAL_PORT1
→opt.SERIAL_PORT1
- 注意:
-aaa
对应opt.aaa
,而非opt.AAA
- 参数名称自动转为
完整执行流程示例
假设脚本保存为 test.py
,以下是几种执行方式及结果:
命令行输入 | 参数赋值结果 | 输出结果 |
---|---|---|
python test.py | aa=100 , bb=10 (全默认) | 110 |
python test.py -aaa 200 -b 30 | aa=200 , bb=30 | 230 |
python test.py --SERIAL_PORT1 /dev/ttyUSB0 --area_thred 2000 --confid_level 0.9 | 其他参数生效,但不影响 aa/bb 的求和 | 仍取决于 aa/bb 的值 |
常见错误排查
参数未定义却传入:
- 报错示例:
error: unrecognized arguments: --unknown
- 解决:检查所有命令行参数是否已在
add_argument()
中定义
- 报错示例:
类型不匹配:
- 尝试给
--confid_level
传字符串"high"
→ 抛出ValueError
- 解决:严格按参数定义的类型传值
- 尝试给
大小写敏感:
--Serial_Port1
≠--SERIAL_PORT1
→ 无法识别- 解决:严格按照定义的大小写格式输入
进阶使用建议
必选参数标记:
parser.add_argument("INPUT_FILE", help="必需输入文件") # 无默认值即为必选
互斥参数组:
group = parser.add_mutually_exclusive_group() group.add_argument("--debug", action="store_true") group.add_argument("--verbose", action="store_true")
同一时刻只能选择一个选项。
带动作的特殊参数:
parser.add_argument("--shout", action="store_true") # 只要出现就设为 True
总结对比表
特性 | 本例实现方式 | 推荐改进方案 |
---|---|---|
参数命名规范 | 混用大小写(如 aaa vs bbb ) | 统一使用下划线命名法(如 aaa_param ) |
帮助信息质量 | 基础描述 | 补充示例用法(如 [default: COM5] ) |
错误处理 | 无自定义错误处理 | 添加 try-except 捕获异常 |
参数验证 | 无 | 添加 choices=['COM5','COM7'] 限制取值范围 |