PyInstaller打包Python项目生成的可执行文件启动即闪退问题求助
问题根因定位
你遇到的闪退根本原因是NotADirectoryError路径缺失异常,和两条pkg_resources相关的警告无关:
- 你使用的57.5.0版本setuptools已经废弃移除了
pkg_resources.py2_warn、pkg_resources.markers两个模块,这两条警告是PyInstaller 4.x版本的兼容检测逻辑触发的,本身不影响程序运行,主动添加隐藏导入反而会因为找不到模块触发报错,直接去掉这两个--hidden-import参数即可。
修复步骤
步骤1:清理旧打包缓存
先删除项目根目录下的dist、build文件夹和main.spec文件,避免旧配置干扰后续打包。
步骤2:修正代码内的路径读取逻辑
你代码中存在直接用相对路径读取main/GUI目录下文件(如UI文件、资源图标等)的逻辑,PyInstaller打包后运行时的工作目录和开发环境不一致,需要统一适配两种运行场景的路径:
在你的main.py中加入如下工具函数,所有访问项目内文件的位置都通过该函数拼接路径:
import sys import os def get_resource_path(relative_path): if getattr(sys, 'frozen', False): # 打包后运行时,取PyInstaller临时解压目录作为根路径 base_path = sys._MEIPASS else: # 开发时运行,取项目根目录为基准 base_path = os.path.abspath(".") return os.path.join(base_path, relative_path)
使用示例:访问main/GUI/ui.py对应的路径写法为get_resource_path("main/GUI/ui.py")。
步骤3:调整打包命令,同步项目目录结构
执行如下打包命令,将整个main子目录作为数据文件打包到最终的可执行文件目录中,保持和开发时一致的目录结构:
pyinstaller --debug=all --add-data "main:main" main.py
Mac系统下--add-data参数格式为源目录:打包后目标目录,上述命令会把项目内的main文件夹整体复制到打包后的运行根目录下。
步骤4:验证运行结果
打包完成后不要直接双击运行可执行文件,打开终端进入dist/main目录,执行./main启动程序,所有运行日志会直接输出在终端中,可确认是否还有其他异常。
可选优化(消除警告)
如果需要消除两条pkg_resources相关警告,可将setuptools降级到45.0.0以下版本,无特殊需求可忽略该操作,警告本身不影响程序运行。
内容的提问来源于stack exchange,提问作者cmb2200
相关产品推荐
相关产品推荐

