我有一个 python 程序,旨在演化一个在 OpenFOAM 中进行 CFD 分析的 3d 模型。分析与名为“mpirun”的程序并行进行;我的 python 脚本通过 subprocess.Popen 运行 mpirun。到目前为止没有什么不寻常的。不同寻常的是,当 mpirun 遇到其子级之一的错误并杀死其子级时,然后打印错误...然后python 父进程冻结。并且不会在某个明显的地方冻结,比如从管道中读取......在随机位置,它只是停止......做任何事情。
我尝试使用“python3 -m trace --trace”运行我的程序,以查看在哪一行停止,这是最终输出:
foam.py(1765): print("-B")
-B
foam.py(1766): if match:
foam.py(1776): print("-A")
-A
foam.py(1777): if re.match(" *Sum of moments *", line_text):
--- modulename: re, funcname: match
re.py(163): return _compile(pattern, flags).match(string)
--- modulename: re, funcname: _compile
re.py(280): try:
re.py(281): p, loc = _cache[type(pattern), pattern, flags]
re.py(282): if loc is None or loc == _locale.setlocale(_locale.LC_CTYPE):
re.py(283): return p
foam.py(1780): print("A")
A
foam.py(1781): if force_mode:
如您所见,它上升到“if force_mode:”....然后就停止了。显然“if bool”不应该挂起。几天来,我一直在努力解决这个问题,但我离答案还很近。
我如何通过 subprocess.Popen 启动进程似乎没有什么不同 - shell=True,shell=False,直接运行“mpirun”,通过 bash 包装器脚本运行它......什么都不重要(我唯一的事情'保持一致的是stdout = subprocess.PIPE,因为我必须能够读取输出)。一旦 mpirun 的一个孩子死亡并报告错误,foam.py 就会挂起。
任何线索可能发生在这里?我难住了。:(