PyInstaller使用onefile参数打包单文件时找不到自定义包问题求助
问题核心原因
- 你之前使用的
--hiden-import存在拼写错误,正确参数为--hidden-import,所以之前的导入配置没有生效。 - PyInstaller的
--onefile模式运行逻辑和常规目录模式不同:单文件exe启动时会先把所有内置资源解压到系统临时目录的随机文件夹下运行,默认只会从这个临时目录和系统Python路径搜索模块,你单独拷贝到dist目录的mylib文件夹不在搜索路径里,所以会找不到。
解决方案
方案1:将mylib包直接打包进exe(推荐,符合单文件分发需求)
直接用--add-data参数把整个mylib包打包到exe内部,不需要额外拷贝文件夹到dist目录,修改你的打包命令即可:
pyinstaller --onefile --add-data "mylib/*;mylib/" myscript.py
如果需要显式声明导入可以加上正确拼写的hidden import参数:
pyinstaller --onefile --hidden-import=mylib --add-data "mylib/*;mylib/" myscript.py
这种方式打包后dist目录只需要保留myscript.exe即可运行,不需要额外带mylib文件夹。
方案2:保留外部mylib文件夹不打包
如果你需要后续可以直接修改外部mylib的代码、不用重新打包exe,可以修改myscript.py的代码,在导入mylib之前手动把exe所在目录加入模块搜索路径:
import sys import os # 把exe所在目录加入模块搜索路径最优先级 sys.path.insert(0, os.path.dirname(os.path.abspath(sys.executable))) from mylib.mypackage import myfunc x = myfunc()
再用你原来的Compile.bat打包即可,运行时exe和mylib文件夹放在同一目录就能正常加载。
内容的提问来源于stack exchange,提问作者qoou
相关产品推荐
相关产品推荐

