如果我从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上安装事件过滤器。
答案 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)
到目前为止,这似乎符合我的要求。