Странное зависание в python, когда подпроцесс возвращает ошибку - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть программа на python, разработанная для разработки 3d-модели, которая анализируется CFD в OpenFOAM.Анализ проводится параллельно с программой под названием «mpirun»;Мой скрипт на Python запускает mpirun через подпроцесс. Открыть.Пока ничего необычного.Что необычно, так это то, что когда mpirun сталкивается с ошибкой одного из своих дочерних элементов и убивает своих дочерних элементов, затем выдает ошибку ... затем родительский процесс python останавливается.И не останавливается в каком-то очевидном месте, например при чтении из канала ... в случайных местах, он просто останавливается ... делает что-либо.

Я попытался запустить свою программу с помощью "python3 -m 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: ".... и затем просто останавливается.Очевидно, «если бул» никогда не должен висеть.Я работал над попыткой выяснить это в течение нескольких дней, и я не приблизился к ответу.

Кажется, не имеет значения, как я запускаю процесс через subprocess.Popen - shell= True, shell = False, запуск "mpirun" напрямую, запуск его через скрипт-оболочку bash ... ничего не имеет значения (единственное, что я сохранил - это stdout = subprocess.PIPE, так как я должен иметь возможность читатьвыход).Как только один из детей mpirun умирает, и он сообщает о своей ошибке, только что висит пенопласт.

Есть какие-нибудь подсказки, что здесь может происходить?Я в тупике.(

1 Ответ

0 голосов
/ 24 сентября 2018

Ответ: Как указано выше, тот факт, что вывод программы проходил через «тройник», чтобы регистрировать ее, чтобы я мог просмотреть все сообщения, фактически вводил меня в заблуждение.Поскольку tee буферизирует его содержимое, я не видел последние сообщения для печати.После снятия тройника я смог увидеть, что он на самом деле висит на трубе с надписью.Я смог это исправить, посмотрев сообщения о смерти и вызвав команду kill на конвейере.

Спасибо за помощь!

...