Pyinstaller打包后EXE不在_internal文件夹的解决方法咨询
解决PyInstaller将主EXE放入_internal文件夹的方法
方法一:自定义Spec文件(推荐方案)
这是最可控且可重复的方式,通过修改PyInstaller的配置文件指定输出结构:
- 生成初始spec文件:
在终端执行命令生成对应脚本的spec配置文件:pyi-makespec your_main_script.py - 编辑生成的
your_main_script.spec文件:
找到EXE和COLLECT节点,修改EXE的destname参数,将主EXE的输出路径指定到_internal文件夹内:exe = EXE(pyz, a.scripts, a.binaries, a.zipfiles, a.datas, [], name='_internal/your_app.exe', # 指定EXE输出到_internal文件夹 debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, console=True) # 根据应用需求调整console参数 coll = COLLECT(exe, a.binaries, a.zipfiles, a.datas, strip=False, upx=True, upx_exclude=[], name='_internal') # COLLECT输出目录保持为_internal - 使用spec文件重新打包:
打包完成后,dist文件夹内的pyinstaller your_main_script.spec_internal目录会包含主EXE以及所有应用依赖文件。
方法二:手动调整(临时快速测试)
如果只是临时测试,可按以下步骤操作:
- 先正常执行PyInstaller打包命令完成初始打包
- 将dist根目录下的主EXE文件移动到dist/_internal文件夹中
- 若应用中存在读取相对路径资源的逻辑,需确保代码中使用
sys._MEIPASS定位资源(PyInstaller运行时会将资源解压到临时目录,sys._MEIPASS为该目录路径),示例代码:import sys import os def get_resource_path(relative_path): if hasattr(sys, '_MEIPASS'): return os.path.join(sys._MEIPASS, relative_path) return os.path.join(os.path.abspath("."), relative_path)
注意事项
- 若应用依赖外部配置文件或资源,需确保这些文件的路径在EXE移动后仍能被正确读取,建议统一使用
get_resource_path这类方法获取资源路径 - 使用spec文件的方式可避免每次打包后手动调整,适合长期维护的项目
内容的提问来源于stack exchange,提问作者Maher Arab
相关产品推荐
相关产品推荐

