在Anaconda环境中使用PyInstaller打包含Sentence Transformers模型的Python脚本时创建可执行文件出错
在Anaconda环境中使用PyInstaller打包含Sentence Transformers模型的Python脚本时创建可执行文件出错
我太懂你这种头疼的情况了——在Anaconda环境里用PyInstaller打包带本地Sentence Transformers模型的脚本,简直是踩坑重灾区,尤其是模型路径和依赖打包这两块。别急,我给你捋几个亲测有效的解决步骤:
第一步:先把Anaconda环境和基础依赖捋顺
- 先激活你的Anaconda目标环境,比如敲这个命令:
conda activate your_env_name(记得把your_env_name换成你自己的环境名哈) - 接着把所有依赖装全,包括PyInstaller:
pip install -r requirements.txt && pip install pyinstaller - 这里一定要先手动跑一遍你的脚本,比如
python app.py,确认脚本本身能正常加载模型、运行逻辑,先排除脚本自己的问题,不然打包了也是白搭。
第二步:修改脚本里的模型路径,适配打包后的环境
你之前直接写./models/st_model的话,打包成exe后路径会乱套——PyInstaller会把文件打包到临时目录里,脚本找不到原来的相对路径了。改成动态获取路径就好,代码改成这样:
import os import sys def get_model_path(): # 判断当前是开发环境还是打包后的exe环境 if getattr(sys, 'frozen', False): base_path = sys._MEIPASS # 打包后的临时目录路径 else: base_path = os.path.dirname(os.path.abspath(__file__)) # 开发环境的脚本所在目录 return os.path.join(base_path, "models", "st_model") # 用这个动态路径加载模型 model = SentenceTransformer(get_model_path())
这样不管是在开发环境跑脚本,还是打包成exe后运行,都能精准找到模型文件。
第三步:用spec文件强制打包模型文件(关键操作!)
PyInstaller默认可能不会自动把models文件夹打包进去,所以得用spec文件手动指定:
- 先生成基础的spec文件:
pyi-makespec --onefile app.py,这时候会生成一个app.spec文件 - 打开这个spec文件,找到
Analysis部分,修改datas参数,把你的模型文件夹加进去,同时还要补全Sentence Transformers的隐藏依赖,修改后的Analysis大概是这样:
a = Analysis( ['app.py'], pathex=[], binaries=[], # 把本地模型文件夹映射到打包后的同路径下 datas=[('models/st_model', 'models/st_model')], # 添加Sentence Transformers的隐藏依赖,避免打包后提示找不到模块 hiddenimports=['sentence_transformers.models', 'sentence_transformers.util', 'sentence_transformers.SentenceTransformer'], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False, )
- 如果你还用到了
extension_app.py,记得把它也加到Analysis的第一个列表里,改成['app.py', 'extension_app.py']
第四步:用spec文件打包生成exe
一切改好后,运行这个命令打包:pyinstaller app.spec,打包完成后,exe文件会在dist文件夹里。
最后:测试一下打包后的exe
进入dist目录,Windows下直接双击app.exe或者命令行敲app.exe,Linux/Mac下敲./app,看看是不是能正常加载模型运行了。
另外给你两个小提醒:
- 每次重新打包前,最好清理一下之前的缓存文件:Windows下用
rmdir /s /q build dist && del __pycache__,Linux/Mac用rm -rf build dist __pycache__,避免旧文件搞出奇怪的问题 - 如果你的Anaconda环境里装了很多无关的包,建议新建一个干净的环境,只装脚本需要的依赖,这样打包出来的exe会小很多,也能减少依赖冲突的概率
内容来源于stack exchange
相关产品推荐
相关产品推荐

