Python: Как определить, что все дочерние процессы подпроцесса завершили работу

Я пытаюсь определить, когда программа установки завершает выполнение из сценария Python. В частности, приложение - это база данных Oracle 10gR2. В настоящее время я использую модуль подпроцесса с Popen. В идеале я бы просто использовал метод wait (), чтобы дождаться завершения установки, однако документированная команда фактически порождает дочерние процессы для обработки фактической установки. Вот пример кода сбойного кода:

import subprocess
OUI_DATABASE_10GR2_SUBPROCESS = ['sudo',
                                 '-u',
                                 'oracle',
                                 os.path.join(DATABASE_10GR2_TMP_PATH,
                                              'database',
                                              'runInstaller'),
                                 '-ignoreSysPrereqs',
                                 '-silent',
                                 '-noconfig',
                                 '-responseFile '+ORACLE_DATABASE_10GR2_SILENT_RESPONSE]
oracle_subprocess = subprocess.Popen(OUI_DATABASE_10GR2_SUBPROCESS)
oracle_subprocess.wait()

Здесь есть аналогичный вопрос: Убивает подпроцесс, включая его дочерние элементы из python , но выбранный ответ не решает проблему дочерних элементов, вместо этого он инструктирует Пользователь должен напрямую вызвать приложение, которого нужно ждать. Я ищу конкретное решение, которое будет ждать всех дочерних процессов подпроцесса. Что делать, если количество подпроцессов неизвестно? Я выберу ответ, который решает проблему ожидания завершения всех дочерних подпроцессов.

Больше ясности относительно сбоя: Дочерние процессы продолжают выполнение после команды wait (), поскольку эта команда ожидает только процесса верхнего уровня (в данном случае это «sudo»). Вот простая диаграмма известных дочерних процессов в этой задаче: Модуль подпроцесса Python -> Sudo -> runInstaller -> java -> (unknown)

5
задан Community 23 May 2017 в 12:14
поделиться