我正在创建一个GUI应用程序(wxPython)。我需要从GUI应用程序运行另一个(.exe)应用程序。子进程将对用户操作执行某些操作,并将输出返回到GUI应用程序
我在循环中运行此子进程,以便不断地执行子进程。我正在做的是,我开始一个线程(所以gui不冻结)和popen 循环中的子进程。不确定这是否是最佳方式。
self.thread = threading.Thread(target=self.run, args=())
self.thread.setDaemon(True)
self.thread.start()
def run(self):
while self.is_listening:
cmd = ['application.exe']
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
proc.wait()
data = ""
while True:
txt = proc.stdout.readline()
data = txt[5:].strip()
txt += data
现在发生的情况是,如果主应用程序关闭,则线程仍在等待从未发生过的用户操作。我该如何干净地退出?即使在GUI应用程序退出后,仍然可以在进程列表中看到application.exe进程。任何改善整个事情的建议都是受欢迎的。
感谢
答案 0 :(得分:2)
1)使'proc'成为一个实例属性,这样你就可以在退出之前调用它的terminate()或kill()方法。
self.thread = threading.Thread(target=self.run, args=())
self.thread.setDaemon(True)
self.thread.start()
def run(self):
while self.is_listening:
cmd = ['application.exe']
self.proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
self.proc.wait()
data = ""
while True:
txt = self.proc.stdout.readline()
data = txt[5:].strip()
txt += data
2)使用一些变量告诉线程停止(你需要在循环中使用poll(),而不是使用wait())。
self.exit = False
self.thread = threading.Thread(target=self.run, args=())
self.thread.setDaemon(True)
self.thread.start()
def run(self):
while self.is_listening:
cmd = ['application.exe']
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
while proc.poll() is None or not self.exit:
pass
data = ""
while True:
if self.exit:
break
txt = proc.stdout.readline()
data = txt[5:].strip()
txt += data
'atexit' module documentation可以帮助您在退出时调用内容。