PySide6中QProcess的finished信号未触发问题求助
问题原因与解决方案
核心问题
你调用的startDetached()是QProcess的静态方法,它不会使用你创建的self.subprocess实例来管理子进程——启动的进程完全独立于该实例,因此你绑定的finished信号根本不会被触发。
解决方案
分两种场景处理:
场景1:不需要进程分离(主进程可以管理子进程生命周期)
直接用QProcess.start()替代startDetached(),这样子进程的状态会和self.subprocess实例绑定,结束时正常触发finished信号:
def begin_subprocess(self, folder_path, return_to_path, return_path): self.subprocess = QProcess() python_executable = sys.executable parameters = [folder_path, str(return_to_path), return_path] command_info = [python_executable, "./true_run.py"] command = command_info + parameters print(command) self.subprocess.finished.connect(self.notify_success_or_failure) # 替换为start()方法 self.subprocess.start(command[0], command[1:])
场景2:必须使用进程分离(子进程独立于主进程运行)
startDetached()会返回(success, pid)元组(成功状态和子进程ID),这种情况下无法通过当前QProcess实例的信号监听结束事件,你需要:
- 通过系统API(比如
psutil库)轮询子进程状态 - 让子进程在结束时主动通知主进程(例如写入状态文件、发送本地网络请求等)
补充说明
startDetached()设计的目的是启动一个完全脱离当前QProcess对象的进程,它不会共享实例的任何状态或信号,所以你之前的信号绑定完全无效。只有使用start()方法创建的子进程,才会和QProcess实例建立关联,触发相应的生命周期信号。
内容的提问来源于stack exchange,提问作者callen44
相关产品推荐
相关产品推荐

