解决 Pyinstaller 6.0.0版本后,打包oneDir时非exe文件被默认归纳到_internal 文件夹问题
现象描述:
自 Pyinstaller>=6.0.0 版本后,在打包 one dir(-D 目录模式)时,除可执行文件外,其余文件都将被转移到 _internal 文件夹下
官方原文:
Restructure onedir mode builds so that everything except the executable (and .pkg if
you’re using external PYZ archive mode) are hidden inside a sub-directory. This
sub-directory’s name defaults to _internal but may be configured with a new
--contents-directory option. Onefile applications and macOS .app bundles are unaffected.
产生的问题:
由此产生的问题就是,旧项目中凡是直接使用相对路径调用的文件,在使用 Pyinstaller>=6.0.0 版本打包后,运行可执行文件时,会找不到这些文件。
解决方案:
-
方案1:
将相对路径替换为生成路径
官方原文
All of onedir build’s contents except for the executable are now moved into a sub-directory (called _internal by default). sys._MEIPASS is adjusted to point to this _internal directory. The breaking implications for this are: 1.Assumptions that os.path.dirname(sys.executable) == sys._MEIPASS will break. Code locating application resources using os.path.dirname(sys.executable) should be adjusted to use __file__ or sys._MEIPASS and any code locating the original executable using sys._MEIPASS should use sys.executable directly. 2.Any custom post processing steps (either in the .spec file or externally) which modify the bundle will likely need adjusting to accommodate the new directory.
修改程序通过模块的
__file__
属性拼装一个路径来引用它们""" @ File : module.py @ Author : yqbao """ print(__file__) # 输出:F:\Projects\test\module.py
-
方案2:
保留旧版本的one dir 布局
官方原文
Allow users to re-enable the old onedir layout (without contents directory) by settings the --contents-directory option (or the equivalent contents_directory argument to EXE in the .spec file) to '.'.
使用
--contents-directory
参数,打包时设置--contents-directory .
来使其启用旧版本的one dir 布局注意此参数生效需要
pyinstaller>=6.1.0
-
方案3:
降低
pyinstaller
版本,pyinstaller < 6.0.0
本文来自博客园作者:星尘的博客,转载请注明出处:https://www.cnblogs.com/yqbaowo/p/17863429.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~