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
手动启动应用、手动运行安装包后自动启动均无报错,但通过应用自身启动安装包再自动启动就会出错。我尝试过两种方式:
- Inno的“安装后启动”功能
- 执行以下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,提问作者Леша
相关产品推荐
相关产品推荐

