Python调用Aspen Custom Modeler OpenDocument报字符串值预期错误
报错触发原因
该com_error是Aspen Custom Modeler(以下简称ACM)的COM接口主动抛出的类型校验异常,错误信息A string value was expected明确指向OpenDocument方法调用时,接口端没有收到符合要求的字符串类型路径参数,常见触发场景如下:
- 模型文件路径包含非ASCII字符(中文、全角符号、特殊转义字符),pywin32在做跨进程COM参数传递时编码转换失败,传入ACM进程的参数变为空值或非字符串类型,触发类型校验失败。
- Python 3环境下部分版本的pywin32默认传递字符串参数时,会将Python原生str包装为变体类型而非COM接口要求的原生BSTR字符串,ACM的旧版COM接口没有做变体类型兼容,直接判定参数类型不符合要求。
- 目标
.acmf文件不存在、当前Python运行账号对文件无读取权限时,部分版本ACM的OpenDocument接口不会抛出精准的文件访问错误,会误返回字符串类型不匹配的报错。 - 调用
win32.Dispatch时传入的ProgID和本地安装的ACM版本不匹配,拉起的COM代理对象接口定义异常,无法正确识别传入的参数类型。
可行解决方法
按以下顺序排查修复,绝大多数场景下前两步即可解决问题:
- 路径合规性校验
将目标Distillationcolumn.acmf文件移动到纯英文、无空格、无特殊符号的短路径下(例如D:\ACM_Workspace\这类磁盘根目录下的新建文件夹),同时确认文件名保持纯英文命名,不要包含中文、括号、空格等字符;手动确认文件存在于目标路径,且当前Windows登录账号对该文件有读取权限。 - 显式转换参数类型
调用OpenDocument方法时,不要直接传入os.path.abspath的返回值,显式将路径转换为Python原生字符串,确保pywin32传递参数时能正确识别为COM兼容的BSTR类型,修正后的代码如下:
import os import win32com.client # 注意确认ProgID和本地安装版本匹配:V10对应3600,V11对应3700,V12对应3800 Application = win32.Dispatch('ACM Application 3700') model_path = os.path.abspath("Distillationcolumn.acmf") # 显式强转为原生字符串,避免COM参数类型识别异常 ACMP = Application.OpenDocument(str(model_path))
- 权限与进程启动方式排查
如果上述操作后仍报错,先手动在桌面启动对应版本的ACM程序,保持程序后台运行后再执行Python代码。部分域管控、权限受限的Windows环境下,Python通过COM后台拉起的ACM进程没有桌面交互权限,会出现各类参数识别异常。 - 版本匹配校验
确认本地安装的ACM版本和Dispatch传入的ProgID对应:V10版本ProgID为ACM Application 3600,V11为ACM Application 3700,V12为ACM Application 3800,版本不匹配时会拉起错误的COM代理对象,导致参数识别失效。
内容的提问来源于stack exchange,提问作者Yin
相关产品推荐
相关产品推荐

