如何用Python自动化运行tNavigator模拟(而非仅启动GUI)
一、优先使用命令行模式(无需GUI,更稳定)
tNavigator支持批处理模式直接运行模拟,无需启动GUI,这比图像识别的方式更可靠,也更容易监控运行状态、提取结果。
1. 命令行核心参数说明
-batch:启用无GUI的批处理运行模式-run:指定启动后直接运行模型-log <日志路径>:输出运行日志到指定文件,用于后续验证运行状态
2. Python实现代码示例
import subprocess import os import time # 路径配置 exe_path = r"D:\tNavigator\t-navigator22.4\tNavigator-22.4.exe" model_path = r"D:\tNavigator\Project\IP14_CO2\IP14_E300.DATA" log_path = r"D:\tNavigator\Project\IP14_CO2\run_log.txt" # RSM文件默认与DATA文件同目录,命名规则为<模型名>.RSM rsm_path = os.path.splitext(model_path)[0] + ".RSM" # 构建命令行参数 cmd = [ exe_path, "-batch", "-run", model_path, "-log", log_path ] # 启动模拟并等待完成 try: print("开始运行模拟...") # 等待进程结束,捕获输出 process = subprocess.run(cmd, check=True, capture_output=True, text=True) print("模拟运行完成!") # 验证模拟是否成功 with open(log_path, "r", encoding="utf-8") as f: log_content = f.read() # 根据tNavigator实际日志关键字调整,示例为"模拟成功完成"的对应英文标识 if "Simulation completed successfully" in log_content: print("✅ 模拟成功完成") else: print("❌ 模拟可能失败,请查看日志确认") # 提取结果文件与摘要 if os.path.exists(rsm_path): print(f"📄 RSM文件路径:{rsm_path}") # 示例:读取RSM文件前10行作为摘要输出 with open(rsm_path, "r", encoding="utf-8") as f: summary = "".join(f.readlines()[:10]) print("📋 模拟摘要:") print(summary) else: print("❌ 未找到RSM结果文件") except subprocess.CalledProcessError as e: print(f"❌ 模拟运行出错,错误信息:{e.stderr}")
二、改进GUI自动化方案(仅当必须使用GUI时)
如果因特殊需求必须依赖GUI,可优化图像识别逻辑,并添加模拟完成的监控机制:
优化后的代码示例
import subprocess import time import pyautogui import os exe_path = r"D:\tNavigator\t-navigator22.4\tNavigator-22.4.exe" model_path = r"D:\tNavigator\Project\IP14_CO2\IP14_E300.DATA" run_btn_image = "run_button.png" # 模拟完成的标识截图(如界面上的"完成"按钮/状态文字) complete_btn_image = "complete_button.png" rsm_path = os.path.splitext(model_path)[0] + ".RSM" # 启动GUI并打开模型 subprocess.Popen([exe_path, model_path]) time.sleep(15) # 根据软件启动速度调整等待时长 # 点击运行按钮 location = pyautogui.locateCenterOnScreen(run_btn_image, confidence=0.85) if location: pyautogui.click(location) print("✅ 已点击运行按钮") else: print("❌ 未找到运行按钮") exit() # 等待模拟完成(双检查机制) print("等待模拟完成...") timeout = 3600 # 最大等待时长(秒),根据模拟耗时调整 start_time = time.time() completed = False while time.time() - start_time < timeout: # 方式1:检查界面完成标识 if pyautogui.locateOnScreen(complete_btn_image, confidence=0.8): completed = True break # 方式2:检查RSM文件是否生成(更可靠) if os.path.exists(rsm_path) and os.path.getsize(rsm_path) > 0: completed = True break time.sleep(30) # 每30秒检查一次 if completed: print("✅ 模拟完成") print(f"📄 RSM文件路径:{rsm_path}") # 可添加界面状态检查逻辑验证模拟是否成功 else: print("❌ 模拟超时未完成")
关键注意事项
- 命令行模式优先:完全脱离GUI依赖,不受分辨率、窗口遮挡影响,错误捕获更直接,是自动化的最优选择。
- 日志校验:通过日志文件的关键字可以精准判断模拟状态,需根据tNavigator的实际日志输出调整校验关键字。
- 绝对路径:所有文件路径建议使用绝对路径,避免相对路径导致的文件找不到问题。
内容的提问来源于stack exchange,提问作者Phoenix Zhaoyu
相关产品推荐
相关产品推荐

