无法从python gui中删除子进程

时间:2014-08-04 04:33:27

标签: python subprocess

我有一个gui,它应该打开一个程序,并在按下退出按钮时退出程序。代码如下:

#!/usr/bin/python
import Tkinter as tk

import subprocess
import os
import signal

class StageGui:
    def __init__(self,parent):
        self.process = None
        self.f = tk.Frame(main, width=300, height=300)
        self.b1=tk.Button(main,text='Start Medina',command=self.startmedina).pack(side='left',anchor='nw')
        self.b2=tk.Button(main,text='Quit Medina',command=self.quitmedina).pack(side='left',anchor='nw')
        self.xf = tk.Frame(self.f,relief='groove', borderwidth=2)

    def startmedina(self):
        self.process=subprocess.Popen(['pre xx'],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True,preexec_fn=os.setsid)
        return
    def quitmedina(self):
        os.killpg(self.process.pid,signal.SIGKILL)
        return  
main = tk.Tk()
stagegui=StageGui(main)
main.title('prototype')

main.mainloop()

当我按下开始按钮时,程序会打开但按下退出时它不会杀死子进程。任何人都能帮我这个吗?

1 个答案:

答案 0 :(得分:0)

使用StageGui.process.terminate()来终止进程,而不是os.kill。如果这不起作用,您可以尝试StageGui.process.kill(),但这相当于发送SIGKILL(假设您在POSIX系统上),这是一个非优雅的关闭进程的方法。

另外,您真的希望process成为类属性,而不是实例属性吗?在self.process = None中设置__init__和在self.process = Popen(...设置startmedina可能更有意义。