Как запустить другой процесс в цикле на другой поток

Я создаю GUI-приложение (wxPython). Мне нужно запустить другое приложение (.exe) из приложения GUI. Подпроцесс будет выполнять некоторую операцию над действием пользователя и возвращать вывод в приложение 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 

Теперь, что происходит, если основное приложение отключено, поток все еще ждет действия пользователя, которое никогда не было. Как я могу выйти чисто? Процесс application.exe все еще можно увидеть в списке процессов, даже после выхода из приложения GUI. Любые предложения по улучшению всего этого приветствуются.

благодаря

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» может помочь вам вызывать вещи при выходе.