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

PyInstaller生成的exe存在文件下载替换及游戏启动异常问题求助

PyInstaller打包单文件exe后,gdown下载异常与游戏启动失效问题排查与解决

问题概述

直接运行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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 21:43:09