子进程不会死
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
处理程序中。
关闭我的应用程序时,所有线程和 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
处理程序中。