1

我有一个 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 就会挂起。

任何线索可能发生在这里?我难住了。:(

4

1 回答 1

0

回答:如上所述,程序的输出是通过“tee”运行以记录它以便我可以检查所有消息的事实实际上误导了我。因为 tee 缓冲了它的内容,所以我没有看到要打印的最后一条消息。取下三通后,我可以看到它实际上挂在一个管道上。我可以通过查找死亡消息然后在管道上调用 kill 来解决这个问题。

谢谢您的帮助!

于 2018-09-23T23:35:14.710 回答