我正在用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'
这很管用…但这真的是个好办法吗??在
如果使用
p.wait()
,则还应将stdout=PIPE
作为Popen
调用的参数。在另一种选择是使用
p.communicate()
,它会自动为您调用wait()
。在任何一种方法都可以。在
这是一个部分的/暂时的答案。研究
psutil
库,该库具有用于查找给定进程的子进程以及等待进程完成的工具。这是一个方法的草图。它有问题,但希望它能为您提供一个工作起点:以下是另一种方法,可能会解决已故祖父母的孙辈问题:
^{pr2}$但你可能仍然有“重新装修”的问题在评论中指出。上面的方法可能有效,或者您最好简单地从Python中反复调用
ps
并解析它的文本输出,等待GUI进程在那里的任何签名出现然后消失。在相关问题 更多 >
编程相关推荐