Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从PySide中的子进程退出信号_Python_Subprocess_Pyside - Fatal编程技术网

Python 从PySide中的子进程退出信号

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

如果我从pythongui应用程序(PySide)中启动外部应用程序,是否有方法安装“exited”信号,以通知用户何时退出/关闭外部应用程序

我知道有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上安装事件筛选器。

如果您使用的是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()信号就是我想要的。请将您的解决方案作为答案发布,而不是将其编辑到您的问题中。相关: