Я пишу программу на python, которая вызывает другую программу с помощью команды subprocess.Popen
.Дождитесь завершения процесса, созданного процессом
Эта программа запускает графический интерфейс пользователя, с которым пользователь взаимодействует, но перед этим он проходит через некоторые службы для аутентификации пользователя.
С учетом сказанного, я пытаюсь выяснить способ узнать, когда пользователь выходит из этого графического интерфейса. В принципе, я хочу дождаться выхода GUI, а затем продолжить в моей программе.
Моя проблема заключается в том, что, поскольку программа, с которой я звоню, проходит через эти службы до начала запуска графического интерфейса, кажется, что программа я делаю вызов до конца, а затем порождает новый процесс, который является графическим интерфейсом, и то я не могу ждать на pid, потому что pid у меня уже завершен.
Я попытался это:
p = subprocess.Popen('/user/sbin/startprogramtolaunchgui')
p.wait()
printf 'done'
Но «сделать» печатается сразу, а не после того, как графический интерфейс вышел из. Кроме того, когда я запускаю команду
ps -ef
Программа «startprogramtolaunchgui», которую я вызывал, не входит в список процессов. НО, я вижу графический интерфейс, что он запущен в списке процессов (тот, который я хочу контролировать)
EDIT:
Я придумал это:
def isRunning(pid):
try:
os.kill(pid, 0)
return True
except OSError:
return False
p = subprocess.Popen('/user/sbin/startprogramtolaunchgui')
time.sleep(5)
temp = subprocess.check_output(['pgrep', 'gui']) #get pid of GUI process
while(isRunning(int(temp))):
pass
print 'GUI CLOSED'
Он работает. .. но это действительно хороший способ сделать это?
Это может работать, но ненадежно. Когда родитель выйдет без прерывания доступа к дочерним элементам, дети получат reparented для pid 1 (init). Если вам посчастливилось запустить 'psutil' достаточно рано, когда ближайший ребенок еще не вышел, но уже породил дочерний процесс, вы могли бы обнаружить внуков.Вероятность этого может быть твердой или тонкой, в зависимости от поведения дочернего процесса. – 9000