如何让Python调用的HYDRUS1D可执行文件超时后自动终止并续跑模拟?
为HYDRUS1D蒙特卡洛模拟设置超时终止机制
问题背景
使用Python脚本调用HYDRUS1D开展蒙特卡洛模拟时,部分模拟会卡住无法收敛。需要为HYDRUS可执行文件设置10秒最长运行时限,超时则自动终止进程,且不中断Python脚本,直接启动下一轮模拟(正常模拟仅需3-5秒)。
当前代码流程:
for value in n_variations_21: for value2 in n_variations_23: write_hydraulic_params('foo',layers,value,value2) run_single_sim()
其中run_single_sim通过os.system执行HYDRUS:
def run_single_sim(): os.system('./hydrus LEVEL_01.DIR')
尝试过线程方案,但os.system会阻塞脚本执行,无法检查运行时长或终止超时线程。
解决方案:使用subprocess替代os.system
subprocess模块比os.system更适合控制子进程,支持直接设置超时时间,超时后自动终止子进程,且不会阻塞主脚本。
步骤1:导入subprocess模块
import subprocess
步骤2:修改run_single_sim函数
def run_single_sim(): try: # 启动HYDRUS进程,设置10秒超时 subprocess.run(['./hydrus', 'LEVEL_01.DIR'], timeout=10, check=False) except subprocess.TimeoutExpired: # 超时后输出提示,直接进入下一轮模拟 print("HYDRUS模拟超时,已终止进程,启动下一轮")
说明
timeout=10:设置子进程最长运行时间为10秒,超时后自动终止HYDRUS进程check=False:即使HYDRUS返回非零退出码(如超时被终止),也不会抛出额外异常,保证主循环继续执行- 若需要捕获HYDRUS的输出或错误信息,可添加
stdout=subprocess.PIPE和stderr=subprocess.PIPE参数,按需处理输出内容
原循环代码无需修改,直接使用修改后的run_single_sim即可实现超时自动终止、不中断主脚本的需求。
内容的提问来源于stack exchange,提问作者Spencejo
相关产品推荐
相关产品推荐

