You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 05:18:01