Python3.6 64位下PyInstaller转换的EXE运行崩溃问题排查
首先,我梳理了你的测试代码和出问题的代码,结合PyInstaller打包Pygame程序的常见坑,找到了几个关键问题,咱们一步步来解决:
1. 最紧急:列表索引越界Bug
你的代码里藏着一个必然会导致崩溃的索引错误——这和PyInstaller无关,但会让程序(不管是脚本还是打包后的exe)在随机触发时直接崩溃:
看这段初始化代码:
random_number = random.randint(0, len(bokmål))
random.randint(a, b)会返回包含a和b在内的整数,而bokmål的长度是18,它的有效索引范围是0~17。当随机数生成18时,访问bokmål[random_number]或者nynorsk[random_number]就会抛出IndexError: list index out of range,直接导致程序闪退。
你已经在正确回答的分支里写对了(random.randint(0, len(bokmål) - 1)),但初始的random_number定义要修正成同样的写法,避免触发索引越界。
2. Pygame字体加载问题(PyInstaller打包常见坑)
你的测试代码没有用到Pygame字体功能,而出问题的代码里用了:
font = pygame.font.SysFont(None, 30)
使用SysFont(None, ...)会调用系统默认字体,但PyInstaller打包时不会自动包含系统字体文件,导致exe运行时找不到字体资源,直接崩溃。
修复方法:
方案A:使用具体字体文件(最可靠)
- 找一个字体文件(比如
Arial.ttf,可以从系统字体目录复制,或者下载开源字体),放在脚本同一目录下。 - 修改字体加载代码:
font = pygame.font.Font("Arial.ttf", 30)
- 打包时用
--add-data参数把字体文件包含进去:
# Windows系统 pyinstaller --console --add-data "Arial.ttf;." your_script.py # macOS/Linux系统 pyinstaller --console --add-data "Arial.ttf:." your_script.py
方案B:强制打包Pygame字体模块(备选)
如果坚持使用系统默认字体,可以尝试在打包时添加隐藏导入:
pyinstaller --console --hidden-import pygame.font your_script.py
不过这种方法兼容性较差,不同系统的默认字体可能不一致,优先推荐方案A。
3. 先获取崩溃的具体错误信息
排查PyInstaller打包问题的第一步,永远是看具体报错:
- 打包时一定要加
--console参数,这样运行exe时会弹出命令行窗口,显示崩溃的具体原因(比如是索引错误还是字体加载失败)。 - 打包命令示例:
pyinstaller --console your_script.py
运行生成的exe后,命令行里的报错信息能帮你快速定位剩余问题。
4. 文件路径相关优化
你的代码里有文件保存逻辑,如果用户输入的路径不存在,或者用了相对路径,exe运行时的工作目录可能和预期不一致,导致文件保存失败:
complet_file = os.path.join(filplasering, navn_på_dock + ".txt") file = open(complet_file, "w")
优化建议:
添加目录存在性检查,自动创建不存在的目录:
import os if filplasering: # 确保用户输入了路径 os.makedirs(filplasering, exist_ok=True) # 路径不存在则自动创建 complet_file = os.path.join(filplasering, navn_på_dock + ".txt") with open(complet_file, "w") as file: file.write(str(words_typed_wrong))
总结
优先修复索引越界的Bug,然后处理字体加载问题,再通过--console参数查看具体错误,应该就能解决exe崩溃的问题了。
内容的提问来源于stack exchange,提问作者Aasmund Runningen

