等待由名为的进程创建的进程结束

2024-09-28 05:21:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用python编写一个程序,它通过subprocess.Popen命令调用另一个程序。在

被调用的程序启动一个用户与之交互的GUI,但在此之前,它通过一些服务来验证用户。在

说到这里,我正试图找出一种方法来知道用户何时退出GUI。基本上,我想等到GUI退出,然后继续我的程序。在

我的问题是,由于我调用的程序在GUI真正启动之前通过这些服务,所以我调用的程序似乎结束了,然后产生了一个新的进程,即GUI,然后不能等待pid,因为pid已经被终止了。在

我试过了:

p = subprocess.Popen('/user/sbin/startprogramtolaunchgui')
p.wait()
printf 'done'

但是“done”会立即打印出来,而不是在GUI退出之后。而且,当我运行命令时

^{pr2}$

我调用的程序“startprogramtolaunchgui”不在进程列表中。但是,我在进程列表中看到它启动的gui(我想监视的那个)

编辑:

我想到了这个:

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'

这很管用…但这真的是个好办法吗??在


Tags: 用户命令程序列表进程guipidsubprocess
2条回答

如果使用p.wait(),则还应将stdout=PIPE作为Popen调用的参数。在

另一种选择是使用p.communicate(),它会自动为您调用wait()。在

任何一种方法都可以。在

这是一个部分的/暂时的答案。研究psutil库,该库具有用于查找给定进程的子进程以及等待进程完成的工具。这是一个方法的草图。它有问题,但希望它能为您提供一个工作起点:

import psutil
parent = psutil.Process(p.pid)
procs = set([parent])
while parent.is_running():  # hmm, OK, but what if one of the children spawns a grandchild *after* the parent has finished... 
    for child in parent.children(recursive=True):
        procs.add(child)
    # Hmm, here we are busy-waiting

psutil.wait_procs(procs)

以下是另一种方法,可能会解决已故祖父母的孙辈问题:

^{pr2}$

但你可能仍然有“重新装修”的问题在评论中指出。上面的方法可能有效,或者您最好简单地从Python中反复调用ps并解析它的文本输出,等待GUI进程在那里的任何签名出现然后消失。在

相关问题 更多 >

    热门问题