You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下Python os.system调用外部exe触发无限循环问题求助

问题描述

点击窗口右上角的‘X’终止脚本时,会触发另一个生成xlsx文件的脚本。生成完成后弹出QMessageBox,理论上点击OK后所有进程应终止,但实际点击OK后会重复运行生成xlsx的脚本,陷入无限循环,只能通过系统登出退出。

相关代码

My.py

[...]
def makexlsx(self, arg1, arg2, arg3 = False):
        if arg3 == 'go':
            os.system('%s %s %s' % ('/home/PycharmProjects/xlsxfile/build/exe.linux-x86_64-3.10/xlsxfile', arg1, arg2))
            sys.exit(0)

xlsxfile可执行文件代码片段

[...]
        wb.save(my_path)
        elapsed_time = round(time.time() - starttime, 2)
        Functions.message_handler(filename + " is ready   Etime: " + str(elapsed_time))
        sys.exit(0)


def message_handler(message):
        msg = QMessageBox()
        print(message)
        msg.setText(str(message))
        msg.setWindowTitle(" BYE ")
        msg.exec_()
        sys.exit(0)
解决方案
  • 替换os.system为subprocess.run
    os.system的进程管理逻辑不够严谨,改用subprocess.run能更精准控制子进程执行,避免主进程与子进程的事件循环冲突:
import subprocess

def makexlsx(self, arg1, arg2, arg3 = False):
        if arg3 == 'go':
            subprocess.run(
                ['/home/PycharmProjects/xlsxfile/build/exe.linux-x86_64-3.10/xlsxfile', arg1, arg2],
                check=True
            )
            sys.exit(0)
  • 防止窗口关闭事件重复触发
    在主进程的窗口关闭事件处理中添加标记,确保makexlsx仅被调用一次。例如重写closeEvent时:
def __init__(self):
    # 初始化时添加关闭状态标记
    self._is_closing = False

def closeEvent(self, event):
    if not self._is_closing:
        self._is_closing = True
        self.makexlsx(arg1, arg2, 'go')
        event.accept()
    else:
        # 已在处理关闭流程,忽略重复事件
        event.ignore()
  • 简化子进程退出逻辑
    子进程中message_handler已经调用sys.exit(0),无需在调用它之后重复执行退出指令,避免冗余导致的进程异常:
# 修改xlsxfile中的代码
wb.save(my_path)
elapsed_time = round(time.time() - starttime, 2)
Functions.message_handler(filename + " is ready   Etime: " + str(elapsed_time))
# 移除此处冗余的sys.exit(0)

内容的提问来源于stack exchange,提问作者user17565490

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 07:47:06