子进程不会死

Subprocess won't die

关闭我的应用程序时,所有线程和 Tkinter 线程都成功关闭,但我拒绝在退出时关闭的子进程。

class ThreadedTask(Thread):

    def __init__(self, queue):
        Thread.__init__(self)
        self.queue = queue

    def run(self):
        proc = Popen("receivetest -f=/dev/pcan33".split(), stdout = PIPE)
        payload = iter(proc.stdout.readline, "")
        for line in payload:
            if line[0].isdigit():
                splitline = line.split()
                self.dictAdd(splitline)

这是包含子进程的 Class。

这是开头的调用:

if __name__ == "__main__":

    root = tk.Tk()

    Data = Queue.Queue()
    DataThread = ThreadedTask(Data)
    DataThread.daemon = True
    DataThread.start()

    myapp = BaudWindow(root)
    root.mainloop()

正如我所说,其他一切都正确关闭。这是因为我在线程中嵌套了一个子进程吗?

那是因为你不是在启动一个子进程,而是一个单独的线程。请尝试 subprocess.popen()。它按照你想要的方式工作。

如果父进程默认死亡,子进程不会自动死亡。参见 Python: how to kill child process(es) when parent dies?

您可以在您的案例中显式调用 proc.terminate(),例如,在 atexit 处理程序中。