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

PyInstaller自动更新时临时文件加载失败问题求助

PyQt+PyInstaller自动更新启动报错问题

我为PyQt+PyInstaller开发的应用搭建了自动更新机制:程序下载Inno Setup安装包并运行后立即关闭,安装包完成新版本替换后自动启动应用,但启动时出现错误:
Failed to load Python DLL 'C:\Users\user\AppData\Local\Temp_MEI278082\python3.10.dll.'

问题流程分析:

  • myProg.exe启动,创建临时文件夹_MEI123
  • myProg关闭,_MEI123文件夹被删除
  • 安装包替换myProg为新版本
  • 新版本启动时尝试访问已不存在的_MEI123

手动启动应用、手动运行安装包后自动启动均无报错,但通过应用自身启动安装包再自动启动就会出错。我尝试过两种方式:

  1. Inno的“安装后启动”功能
  2. 执行以下Python代码调用CMD命令:
subprocess.Popen(['cmd.exe', '/c', fr'{installer_path} /silent && {exe_path}'], creationflags=0x00000008 | 0x00000200)

两种方式都报错;但手动在控制台执行以下命令则无报错:

start /wait "C:\Users\user\myProg_setup.exe" /silent && "C:\Users\user\myProg.exe" 

目前唯一可行的方案是重命名安装文件,但并不理想。

最小复现示例

main.py代码:

import subprocess
import sys
from PyQt5.QtWidgets import QApplication, QPushButton

def update():                                               # 路径指向同一个exe
    subprocess.Popen(["cmd.exe", "/c", r"timeout /t 2 && C:\pytest\dist\main.exe"], creationflags=0x00000008 | 0x00000200, close_fds = True)
    app.quit()

app = QApplication(sys.argv)
button = QPushButton('Click me!')
button.clicked.connect(update)
button.show()
sys.exit(app.exec_())

打包命令:

pyinstaller .\main.py --onefile --noconsole

运行main.exe并点击按钮即可复现问题。

我猜测:即使添加了参数,subprocess.Popen仍无法创建与父进程完全隔离的实例,新启动的程序误以为父进程仍活跃,试图访问已关闭的父进程Python解释器,但这只是我的假设。

内容的提问来源于stack exchange,提问作者Леша

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 16:22:10