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.runos.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
相关产品推荐
相关产品推荐

