如何在不同线程的循环中运行另一个进程

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进程.任何改善整个事情的建议都是值得欢迎的.

谢谢

Art*_*par 2

1) 让“proc”成为一个实例属性,这样你就可以在退出之前调用它的terminate()或kill()方法。

\n\n
self.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\n
Run Code Online (Sandbox Code Playgroud)\n\n

2)使用一些变量告诉线程停止(您需要在循环中使用 poll(),而不是使用 wait())。

\n\n
self.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\n
Run Code Online (Sandbox Code Playgroud)\n\n

“atexit”模块文档可以帮助您在退出时调用事物。

\n