Везде, куда я смотрю, кажется, что это невозможно решить в общем случае. Я собрал библиотеку pidmon, которая объединяет некоторые ответы для Windows и Linux и может сделать то, что вам нужно.
Я планирую почистить это и поместить на github, возможно, под названием 'pidmon' или что-то в этом роде. Я опубликую ссылку, если / когда получу ее.
РЕДАКТИРОВАТЬ: Это доступно в http://github.com/dbarnett/python-pidmon.
Я создал специальную функцию waitpid
, которая принимает аргумент graft_func
, чтобы вы могли свободно определять, какого рода процессы вы хотите ожидать, когда они не являются прямыми дочерними элементами:
import pidmon
pidmon.waitpid(oracle_subprocess.pid, recursive=True,
graft_func=(lambda p: p.name == '???' and p.parent.pid == ???))
или, в качестве дробовика, просто подождать, пока не начнутся какие-либо процессы после повторного вызова waitpid
, выполнить:
import pidmon
pidmon.waitpid(oracle_subprocess.pid, graft_func=(lambda p: True))
Обратите внимание, что это все еще едва проверено в Windows и кажется очень медленным в Windows (но я упоминал, что это на github, где его легко раскошелиться?). По крайней мере, это должно помочь вам начать работу, и если у вас это сработает, у меня будет множество идей по его оптимизации.