2015-11-02 64 views
2

如果我從Python GUI應用程序(PySide)啓動外部應用程序,是否有方法安裝'exited'信號,以便在用戶退出/關閉外部應用程序時進行通知?來自PySide中子進程的已退出信號

我明白有subprocess.poll()和subprocess.wait(),但我更多的是信號/插槽程序,而不是輪詢過程。如果還有其他選項,不使用子進程,我也很樂意實現它們。

這是我與此刻玩弄的辦法:

def eventFilter(self, source, event): 
    if event.type() == QtCore.QEvent.Close/ChildRemoved/etc.: 
     print("App closed!") 
     self.AppClosedHandler() 

self.App = subprocess.Popen([r'C:\WINDOWS\SYSTEM32\some_application.exe'], shell=True) 
self.App.installEventFilter(self) 

可惜你不能在POPEN安裝一個事件過濾器。

+1

這需要處理哪些平臺?你有任何控制其他應用程序的源代碼?爲什麼你不能使用'wait()'或'poll()'? – ekhumoro

+0

這將不得不在Windows上運行,主要是64位8.1。我無法控制其他應用程序的源代碼,我只是簡單地調用應用程序.exe。我可以使用wait()或poll(),我只希望有一個很好的信號可用。按照下面的說法,我認爲QProcess.finished()信號就是我所追求的。 – jars121

+0

請將您的解決方案作爲答案發布,而不是將其編輯到您的問題中。 – ThiefMaster

回答

1

如果您使用Pyside,那麼您絕對可以使用Qprocess。當過程結束時發出信號:Qprocess.finished

+0

感謝您的建議,這正是我正在尋找的功能!鑑於我在上面編輯中發佈的示例代碼,如何安裝self.App作爲QProcess的「進程」來觀看? – jars121

0

下面是我最終使用的解決方案。我在64位Windows 7平臺上使用32位Python安裝,因此我需要禁用自動x64重定向才能訪問System32應用程序。因此,我使用一個類來暫時禁用自動重定向:

class DisableRedirection: 
    _Disable = ctype.windll.kernel32.Wow64DisableWow64FsRedirection 
    _Revert = ctypes.windll.kernel32.Wow64RevertWow64FsRedirection 
    def __enter__(self): 
     self.OldValue = ctypes.c_long() 
     self.Success = self._Disable(ctypes.byref(self.OldValue)) 
    def __exit__(self, type, value, traceback): 
     if self.Success: 
      self._Revert(self.OldValue) 
      print("Closed!") 

我只是運行「與」語句,這樣子進程運行時重定向正在發生中的子進程調用。當我關閉外部應用程序,重定向完成,從而允許我用DisableRedirection類的出口功能:

with DisableRedirection(): 
    self.App = subprocess.Popen([r'C:\WINDOWS\SYSTEM32\Application.exe'], shell=True) 

到目前爲止,這似乎是做什麼,我需要。