Windows下如何用Python subprocess调用WSL的Ubuntu终端运行OpenFOAM
Windows Python通过subprocess调用WSL运行OpenFOAM方案
核心实现逻辑
不要通过executable指定Ubuntu图形终端可执行文件,直接调用WSL官方命令行工具wsl.exe触发后台执行,显式加载环境变量后执行OpenFOAM指令即可,无需迁移现有Python代码。
可直接复用的代码示例
基础调用模板
import subprocess # 你的OpenFOAM指令,示例为执行blockMesh和icoFoam of_commands = """ source ~/.bashrc cd /mnt/d/foam_cases/your_case_dir blockMesh > log.blockMesh 2>&1 icoFoam > log.icoFoam 2>&1 """ try: result = subprocess.run( # 多发行版可加参数指定:['wsl', '-d', 'Ubuntu-22.04', 'bash', '-c', of_commands] ['wsl', 'bash', '-c', of_commands], capture_output=True, text=True, check=True, timeout=3600 # 可根据模拟时长调整超时时间 ) print("指令执行成功") # 如需查看命令输出可打印result.stdout except subprocess.CalledProcessError as e: print(f"执行失败,错误信息:{e.stderr}") except subprocess.TimeoutExpired: print("执行超时")
自动转换Windows路径为WSL路径
如果你的算例存在Windows文件系统下,可通过wslpath自动转换路径,无需手动拼接:
win_case_path = r"D:\foam_cases\damBreak" # 转换Windows路径为WSL可识别的路径 path_convert_result = subprocess.run( ['wsl', 'wslpath', '-a', win_case_path.replace('\\', '/')], capture_output=True, text=True, check=True ) wsl_case_path = path_convert_result.stdout.strip() # 拼接执行指令 of_commands = f""" source ~/.bashrc cd {wsl_case_path} blockMesh icoFoam """ # 后续执行逻辑同上
关键注意事项
- 非交互式bash默认不会加载
~/.bashrc,必须显式添加source指令,若你的OpenFOAM环境变量没有写入.bashrc,可替换为source对应的OpenFOAM环境脚本,例如source /opt/openfoam9/etc/bashrc - 若需要实时打印OpenFOAM运行日志,可将
capture_output=True替换为stdout=subprocess.PIPE, stderr=subprocess.STDOUT,然后逐行读取输出流 - 若WSL默认登录用户不是你配置OpenFOAM环境的用户,可添加
-u 用户名参数指定执行用户
内容的提问来源于stack exchange,提问作者LorenzH
相关产品推荐
相关产品推荐

