Как запустить другой процесс в цикле в другом потоке - PullRequest
5 голосов
/ 23 февраля 2011

Я создаю приложение с графическим интерфейсом (wxPython).Мне нужно запустить другое (.exe) приложение из приложения с графическим интерфейсом.Подпроцесс выполнит некоторую операцию над действием пользователя и вернет вывод приложению с графическим интерфейсом

Я запускаю этот подпроцесс в цикле, так что подпроцесс постоянно доступен для выполнения.То, что я делаю, я запускаю поток (чтобы графический интерфейс не зависал) и открывал подпроцесс в цикле.Не уверен, что это лучший способ.

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 все еще можно увидеть в списке процессов даже после выхода из приложения с графическим интерфейсом.Любые предложения по улучшению всего приветствуются.

спасибо

1 Ответ

2 голосов
/ 23 февраля 2011

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

...