PySide中来自子进程的退出信号

时间:2015-11-02 21:59:42

标签: python subprocess pyside

如果我从Python GUI应用程序(PySide)中启动外部应用程序,有没有办法安装一个'退出的' signal,当用户退出/关闭外部应用程序时通知?

我理解了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上安装事件过滤器。

2 个答案:

答案 0 :(得分:1)

如果您使用Pyside,那么您绝对可以使用Qprocess。进程结束时会发出一个信号:Qprocess.finished

答案 1 :(得分: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!")

我只是在'with'语句中运行子进程调用,以便在重定向发生时运行子进程。当我关闭外部应用程序时,重定向完成,因此允许我使用DisableRedirection类的退出功能:

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

到目前为止,这似乎符合我的要求。