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

时间:2011-02-23 16:06:26

标签: python multithreading user-interface wxpython subprocess

我正在创建一个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进程。任何改善整个事情的建议都是受欢迎的。

感谢

1 个答案:

答案 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可以帮助您在退出时调用内容。