Har*_*eet 5 python user-interface multithreading subprocess wxpython
我正在创建一个GUI应用程序(wxPython).我需要从GUI应用程序运行另一个(.exe)应用程序.子进程将对用户操作执行一些操作,并将输出返回给GUI应用程序
我在循环中运行此子进程,以便不断地执行子进程.我正在做的是,我启动一个线程(因此gui不会冻结)并在循环中打开子进程.不确定这是不是最好的方法.
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
Run Code Online (Sandbox Code Playgroud)
现在发生的情况是,如果主应用程序关闭,则线程仍在等待从未发生过的用户操作.我该如何干净地退出?即使在GUI应用程序退出后,仍然可以在进程列表中看到application.exe进程.任何改善整个事情的建议都是值得欢迎的.
谢谢
1) 让“proc”成为一个实例属性,这样你就可以在退出之前调用它的terminate()或kill()方法。
\n\nself.thread = threading.Thread(target=self.run, args=())\nself.thread.setDaemon(True)\nself.thread.start()\n\ndef run(self):\n while self.is_listening:\n cmd = [\'application.exe\']\n self.proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)\n self.proc.wait()\n data = ""\n while True:\n txt = self.proc.stdout.readline()\n data = txt[5:].strip()\n txt += data\nRun Code Online (Sandbox Code Playgroud)\n\n2)使用一些变量告诉线程停止(您需要在循环中使用 poll(),而不是使用 wait())。
\n\nself.exit = False\nself.thread = threading.Thread(target=self.run, args=())\nself.thread.setDaemon(True)\nself.thread.start()\n\ndef run(self):\n while self.is_listening:\n cmd = [\'application.exe\']\n proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)\n while proc.poll() is None or not self.exit:\n pass\n data = ""\n while True:\n if self.exit:\n break\n txt = proc.stdout.readline()\n data = txt[5:].strip()\n txt += data\nRun Code Online (Sandbox Code Playgroud)\n\n“atexit”模块文档可以帮助您在退出时调用事物。
\n