如何在调用run_problem时实时将SNOPT_summary.out内容输出到终端?
实现Dymos调用run_problem时实时回显SNOPT输出到终端
可以通过以下几种方法实现需求:
直接配置SNOPT输出到终端
在设置SNOPT驱动的选项时,将SNOPT的输出文件指定为标准输出流(stdout),这样输出会同时显示在终端并可选择写入文件。修改优化器配置的示例代码如下:from openmdao.api import Problem import dymos as dm prob = Problem() # 此处添加你的Dymos模型构建代码 # 配置SNOPT作为优化器 prob.driver.options['optimizer'] = 'SNOPT' # 将Print file和Summary file指向标准输出(1对应stdout) prob.driver.opt_settings['Print file'] = 1 prob.driver.opt_settings['Summary file'] = 1 # 若需同时保留文件输出,可使用列表格式:['snopt_output.out', 1]这种方式最直接,让SNOPT原生支持终端输出,无需额外处理文件。
实时监控SNOPT输出文件
如果不想改动优化器配置,可启动后台线程实时读取SNOPT_summary.out的新增内容并打印到终端。示例代码:import threading import time def monitor_snopt_log(filename): with open(filename, 'r') as f: f.seek(0, 2) # 移动文件指针到末尾 while True: line = f.readline() if line: print(line.rstrip()) else: time.sleep(0.1) # 启动监控线程(daemon=True确保主线程结束时自动退出) threading.Thread(target=monitor_snopt_log, args=('SNOPT_summary.out',), daemon=True).start() # 执行问题求解 prob.run_problem()调整OpenMDAO日志级别
OpenMDAO的日志系统可捕获部分SNOPT输出,确保脚本开启了足够的日志级别:import logging logging.basicConfig(level=logging.INFO)结合前两种方法,能更全面地在终端获取SNOPT的运行信息。
内容的提问来源于stack exchange,提问作者Philip Hahn
相关产品推荐
相关产品推荐

