Python 从PySide中的子进程退出信号
如果我从pythongui应用程序(PySide)中启动外部应用程序,是否有方法安装“exited”信号,以通知用户何时退出/关闭外部应用程序 我知道有subprocess.poll()和subprocess.wait(),但我更关注信号/插槽过程,而不是轮询过程。如果还有其他选择,不使用子流程,我也很乐意实现它们 这就是我目前正在玩弄的方法:Python 从PySide中的子进程退出信号,python,subprocess,pyside,Python,Subprocess,Pyside,如果我从pythongui应用程序(PySide)中启动外部应用程序,是否有方法安装“exited”信号,以通知用户何时退出/关闭外部应用程序 我知道有subprocess.poll()和subprocess.wait(),但我更关注信号/插槽过程,而不是轮询过程。如果还有其他选择,不使用子流程,我也很乐意实现它们 这就是我目前正在玩弄的方法: def eventFilter(self, source, event): if event.type() == QtCore.QEvent.C
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上安装事件筛选器。如果您使用的是Pyside,那么您肯定可以使用。进程结束时会发出一个信号:这是我最后使用的解决方案。我在64位Windows7平台上使用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)
到目前为止,这似乎满足了我的要求。谢谢你的建议,这正是我想要的功能!考虑到我在上面的编辑中发布的示例代码,我如何将self.App安装为QProcess“process”进行监视?这需要在哪些平台上工作?您是否可以控制其他应用程序的源代码?为什么不能使用
wait()
或poll()
?这必须在Windows上运行,主要是64位8.1。我无法控制其他应用程序的源代码,我只是调用application.exe。我可以使用wait()或poll(),我只是希望有一个好的信号可用。根据以下内容,我认为QProcess.finished()信号就是我想要的。请将您的解决方案作为答案发布,而不是将其编辑到您的问题中。相关: