【问题标题】:Exited signal from subprocess in PySidePySide中子进程的退出信号
【发布时间】:2015-11-03 07:42:15
【问题描述】:

如果我从 Python GUI 应用程序 (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 上安装事件过滤器。

【问题讨论】:

  • 这必须在哪些平台上运行?您是否可以控制其他应用程序的源代码?为什么不能使用wait()poll()
  • 这必须在 Windows 上工作,主要是 64 位 8.1。我无法控制其他应用程序的源代码,我只是调用应用程序 .exe。我可以使用 wait() 或 poll(),我只是希望有一个好的信号可用。如下所示,我认为 QProcess.finished() 信号是我所追求的。
  • 请将您的解决方案作为答案发布,而不是将其编辑到您的问题中。

标签: python subprocess pyside


【解决方案1】:

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

【讨论】:

  • 感谢您的建议,这正是我正在寻找的功能!鉴于我在上面的编辑中发布的示例代码,我如何安装 self.App 作为 QProcess 的“进程”来观看?
【解决方案2】:

这是我最终使用的解决方案。我在 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 类的 exit 函数:

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

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

【讨论】:

    猜你喜欢
    • 2015-10-20
    • 2020-01-22
    • 1970-01-01
    • 2015-11-05
    • 2012-01-30
    • 2011-07-11
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    相关资源
    最近更新 更多