Pyomo导入dat文件创建实例报SimHours参数未定义ValueError
Pyomo导入dat文件创建实例报SimHours参数未定义的解决方案
报错复现
执行实例创建代码:instance = model.create_instance('input/pownet_data_camb_2022.dat')
触发报错:
ValueError: Error retrieving immutable Param value (SimHours): The Param value is undefined and no default value is specified.
模型中已提前定义对应参数:model.SimHours = Param(within=PositiveIntegers)
排查与修复方案
按优先级依次排查以下问题:
- 校验dat文件内参数名匹配度:Pyomo对参数名大小写、拼写完全敏感,确认dat文件中目标参数名与模型定义完全一致为
SimHours,不存在大小写错误、拼写偏差,同时确认参数赋值行没有被#开头的注释标记屏蔽。 - 校验dat文件内标量参数的语法格式:单值标量参数的正确书写格式为
param SimHours := 对应正整数值;,不能遗漏param关键字、语句结尾分号,也不能将赋值符号:=误写为=。正确写法示例:# dat文件内正确写法 param SimHours := 8760; - 校验dat文件路径有效性:Pyomo在传入的dat路径不存在时,不会直接抛出文件不存在异常,只会加载空数据生成实例,最终触发参数未定义报错。执行创建实例前可先验证路径有效性:
如果路径校验返回False,直接修正为dat文件的绝对路径传入即可,避免相对路径与工作目录不匹配的问题。import os # 打印当前代码执行的工作目录 print(os.getcwd()) # 校验dat文件路径是否可访问 print(os.path.exists('input/pownet_data_camb_2022.dat')) - 校验参数的作用域匹配:如果
SimHours是定义在模型子Block(例如model.config、model.system这类子模块)下的参数,dat文件内的参数赋值必须写在对应Block的命名空间下,不能直接放在全局参数区,否则模型无法匹配到对应参数的赋值。 - 快速定位问题根因:可临时给参数添加默认值做验证,将参数定义修改为
model.SimHours = Param(within=PositiveIntegers, default=8760),如果此时实例可以正常创建,即可确认问题根源是dat文件未被正确读取、或dat文件内参数写法不符合规范。
内容的提问来源于stack exchange,提问作者Awol SEiD
相关产品推荐
相关产品推荐

