2015-11-02 24 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) 

到目前为止,这似乎是做什么,我需要。