QProcess正常退出

Posted

技术标签:

【中文标题】QProcess正常退出【英文标题】:QProcess exit normally 【发布时间】:2018-12-20 22:43:12 【问题描述】:

我正在使用带有 qt 的 python,当 Qprocess 正常退出时我找不到触发信号的方法,根据 Pyqt 文档finished() 信号可以接受 2 个参数 exitCode 和 exitStatus

这就是 Pyqt 文档中关于finished() 信号的说明

http://pyqt.sourceforge.net/Docs/PyQt4/qprocess.html#finished

void 已完成 (int, ::QProcess::ExitStatus)

这是此信号的默认重载。

该信号在进程完成时发出。 exitCode 是出口 进程的代码,exitStatus 是退出状态。之后 进程已经完成,QProcess 中的缓冲区仍然完好无损。你 仍然可以读取进程之前可能写入的任何数据 完成了。

QProcess.ExitStatus

这个枚举描述了 QProcess 的不同退出状态。

常数............值............描述

QProcess.NormalExit....... 0.......进程正常退出。

QProcess.CrashExit........ 1.......进程崩溃了。

我尝试使用此语法,但没有成功

self.process.finished(0,QProcess_ExitStatus=0).connect(self.status)

备注:

状态只是任何插槽(任何动作)的符号,而不是特定的东西

更新:

为了了解问题,我有多个进程(将其视为队列)我需要 python 来执行第一个进程,并且只有在前一个进程正常退出时才移动到下一个进程而不是强制退出使用杀死()或终止()

提前致谢

【问题讨论】:

self.process.finished[int, QProcess.ExitStatus].connect(self.status) 或只是self.process.finished.connect(self.status)(获取默认值)。 感谢这个语法很有帮助我使用 self.process = QtCore.QProcess(self) self.process.finished[int,self.process.ExitStatus].connect(status) 并解决了问题但仍然一件事我想不通,为什么python以这种方式理解这种语法,我没有给它任何 ExitStatus 值给它他知道我是否需要为 NormalExit 或 CrashExit 执行插槽 您不需要这样做:只需使用self.process.finished.connect(self.status),它就会做正确的事情。 QProcess 在发出信号时会自动发送正确的退出代码和状态。所以你只需要将finished 连接到一个接受两个参数的槽,然后检查参数的值来决定你的代码接下来应该做什么。 【参考方案1】:

您不必指向连接中的符号,而是在 pyqtSlot 的帮助下指向插槽中的符号。

from PyQt4 import QtCore

class Helper(QtCore.QObject):
    def __init__(self, parent=None):
        super(Helper, self).__init__(parent)
        self.process = QtCore.QProcess(self)
        self.process.start("ping -c 4 google.com")
        self.process.finished.connect(self.status)

    @QtCore.pyqtSlot(int, QtCore.QProcess.ExitStatus)
    def status(self, exitCode, exitStatus):
        print(exitCode, exitStatus)
        QtCore.QCoreApplication.quit()

if __name__ == '__main__':
    import sys
    app = QtCore.QCoreApplication(sys.argv)
    h = Helper()
    sys.exit(app.exec_())

更新:

from PyQt4 import QtCore

class Helper(QtCore.QObject):
    def __init__(self, parent=None):
        super(Helper, self).__init__(parent)
        self.process = QtCore.QProcess(self)
        self.process.start("ping -c 4 google.com")
        self.process.finished.connect(self.on_finished)

    @QtCore.pyqtSlot(int, QtCore.QProcess.ExitStatus)
    def on_finished(self, exitCode, exitStatus):
        if exitStatus == QtCore.QProcess.NormalExit:
            self.status()

    def status(self):
        print("status")

【讨论】:

如果问题不够清楚,我的错误是我写的(状态)只是作为任何插槽(任何动作)的符号而不是特定的东西,我真的需要执行那个插槽只有当进程正常退出时不是使用 terminate() 或 kill() 强制退出 @Mohamedsayed 装饰器 pyqtSlot () 指向接受连接中插槽的签名,在完成的情况下,它表明文档已超载,也就是说,两个信号具有相同的名称,但传递不同的信息,因此必须明确指出需要使用哪些标志。另一个优点是连接是在 C++ 端提供的,因此除了其他好处外,它更快、更便宜。 非常感谢它使我的代码正常工作,最后一件事对我来说似乎很奇怪,我不太理解是@QtCore.pyqtSlot(int, QtCore.QProcess.ExitStatus) 你能解释一下吗跨度> @Mohamedsayed 我解释了,你读过我之前的评论吗?:装饰器pyqtSlot() 指向接受连接中插槽的签名,在完成的情况下,它表示docs 是重载的,也就是说 2 个具有相同名称但传输不同信息的信号,因此必须明确指出需要使用哪些信号。另一个优点是连接是在 C++ 端提供的,因此除了其他好处之外,它更快、更便宜 不知道为什么pyqt4定义了两个重载。因为qt4 certainly doesn't。因此,选择重载没有意义,插槽装饰器也没有区别。 QProcess 只能发出finished(int exitCode, QProcess::ExitStatus exitStatus),所以你应该只使用self.process.finished.connect(self.status)(它选择默认值)。这似乎是一个在 pyqt5 中修复的小错误,其中 QProcess 现在只有一个 finished 重载。

以上是关于QProcess正常退出的主要内容,如果未能解决你的问题,请参考以下文章

QProcess 在完成前退出

如何使用 Ctrl+C 输入干净地退出 QProcess?

QProcess 退出状态并开始新的

运行自定义可执行文件,QProcess 立即退出,退出代码为 1

在 Windows 上向 QProcess 发送 Ctrl+C

QProcess 执行 python3 脚本无法正常工作