我有一個應用程序,它包含一個wxPython GUI,它在初始化時啓動監視器觀察者和python進程。關閉wxPython窗口時,Python看門狗未終止
class MonitorApp(wx.App):
def __init__(self):
wx.App.__init__(self, True, 'monitor_stderr.log', False, False)
self.q = Queue()
self.m = Queue()
self.e = Queue()
monitor_handler = DirectoryMonitorHandler(self.q)
self.folder_monitor = polling.PollingObserver()
self.folder_monitor.schedule(monitor_handler, source, recursive = True)
self.folder_monitor.start()
self.backlog_manager = BacklogManager(self.q, self.m, self.e)
self.backlog_manager.start()
我從這個wx.TaskBarIcon回調方法關閉的wxPython窗口:
def onClickExit(self, event):
app.keepGoing = False
app.DestroyChildProcess()
self.RemoveIcon()
self.Destroy()
self.frame.Destroy()
其中DestroyChildProcess是:
def DestroyChildProcess(self):
self.folder_monitor.stop()
self.folder_monitor.join()
self.backlog_manager.terminate()
注意BacklogManager是一個多處理過程的子類。我遇到的問題是,當我關閉wxPython GUI窗口時,我仍然在Windows任務管理器中看到兩個pythonw.exe進程。有三種可能性:
- 我沒有正確終止GUI過程。 (不知道它是否是一個過程)
- 我沒有正確終止看門狗觀察者。
- 我沒有正確終止backlog_manager進程。
從代碼中玩弄,看起來調用「self.backlog_manager.terminate()」似乎工作正常,只剩下一個pythonw.exe實例在運行。
有沒有辦法讓我正確終止或停止所有pythonw.exe進程?我究竟做錯了什麼?
編輯 - 經過進一步調查,似乎這可能是我用來啓動我的python腳本的.bat腳本的問題。我基本上使用pythonw.exe和START/B來隱藏命令行窗口。
cd %~dp0
START /B .\Modules\statusWindow.pyw
看來,當我開始用下面的腳本:
cd %~dp0
.\Modules\statusWindow.py
當我關閉命令行窗口,所有的Windows任務管理器進程結束。我懷疑這可能是pythonw.exe的問題或者我結束這個過程的方式。