PyInstaller生成的exe存在文件下载替换及游戏启动异常问题求助
问题概述
直接运行Python脚本时,文件下载替换、游戏启动功能均正常;但通过pyinstaller --onefile --noconsole --icon=icone.ico PWULauncher.py打包为单文件exe后,出现两个核心问题:
- gdown下载的文件变为0字节的临时格式(如
.1ad61sadtemp),无法完成替换 - 游戏启动函数失效,无法找到游戏可执行文件或启动失败
已尝试管理员权限运行、调整文件夹权限、修改PyInstaller参数等方案,问题仍存在。
排查与解决方案
一、文件下载异常(gdown临时文件残留/0字节)
1. 开启控制台查看错误日志
打包时暂时移除--noconsole参数,重新生成exe:
pyinstaller --onefile --icon=icone.ico PWULauncher.py
运行exe后查看控制台输出,确认gdown下载时是否抛出权限、路径类异常,定位具体失败原因。
2. 替换gdown为手动下载逻辑
gdown默认会创建临时文件,打包后可能因临时目录权限或重命名机制失效导致文件异常。改用requests分块下载,直接写入目标文件:
import requests def DownloadFile(self, url, destination): try: # 确保目标目录存在 os.makedirs(os.path.dirname(destination), exist_ok=True) # 分块下载避免大文件内存占用 with requests.get(url, stream=True) as r: r.raise_for_status() with open(destination, 'wb') as f: for chunk in r.iter_content(chunk_size=8192): f.write(chunk) print("File downloaded successfully:", destination) except Exception as e: print("Error downloading the file:", e)
该方式直接写入目标路径,不会生成临时文件,避免gdown的临时文件重命名问题。
3. 确认目标路径的写入权限
避免将文件下载到系统受保护目录(如C:\Program Files),优先选择exe所在目录或用户可读写路径(如%USERPROFILE%\Documents)。
二、游戏启动函数失效
1. 修正打包后的路径获取逻辑
单文件exe运行时,os.path.dirname(os.path.abspath(__file__))指向PyInstaller临时解压目录,而非exe实际所在目录。替换为以下路径获取逻辑:
import sys def get_exe_dir(): if getattr(sys, 'frozen', False): # 打包为exe时,返回exe所在目录 return os.path.dirname(sys.executable) else: # 脚本运行时,返回脚本所在目录 return os.path.dirname(os.path.abspath(__file__))
在start_game函数中替换原script_dir的获取:
def start_game(self, game_exe_path, username, password, character_name, idx): script_dir = get_exe_dir() # 替换为新的路径获取函数 current_dir = os.getcwd() os.chdir(script_dir) game_dir = os.path.join(script_dir, "game") # 后续逻辑保持不变...
这样打包后,script_dir会指向exe所在目录,确保能找到game子文件夹中的游戏可执行文件。
2. 优化subprocess启动参数
若游戏exe依赖当前工作目录,可在subprocess.Popen中直接指定cwd参数,无需频繁切换目录:
subprocess.Popen( [game_exe_path, 'startbypatcher', f'user:{username}', f'pwd:{password}', f'role:{character_name}'], creationflags=subprocess.CREATE_NO_WINDOW, cwd=game_dir # 直接指定工作目录 )
同时确保game_exe_path为绝对路径:
game_exe_path = os.path.join(game_dir, "实际游戏exe文件名.exe")
3. 全局热键权限排查
打包后keyboard库注册全局热键可能需要管理员权限,可在代码中添加权限检查逻辑,或提示用户以管理员身份运行exe。
额外建议
- 打包时添加
--debug=all参数,生成调试版本,查看更详细的运行日志 - 若第三方库(如
pygetwindow、win32gui)未被正确收集,可通过--hidden-import手动指定缺失模块
内容的提问来源于stack exchange,提问作者Caio C.

