如何使用PyInstaller打包Spacy?求含Spacy与语言模型的最小可运行PyInstaller示例
解决PyInstaller打包Spacy时找不到模型的问题
我之前打包Spacy的时候也踩过这个“找不到模型”的坑!其实核心问题就是PyInstaller打包后,程序的运行环境和开发时不一样,Spacy默认依赖的系统级模型路径在打包后的独立程序里根本访问不到。下面给你一套亲测有效的解决方案,还有完整的最小可运行示例:
一、先把模型下载到本地项目目录
别让Spacy把模型装在系统默认路径里,我们直接把模型下载到项目文件夹里,这样打包的时候能一起带进去:
python -m spacy download en_core_web_sm --directories ./models
执行完后,你的项目根目录会多出一个models文件夹,里面就是en_core_web_sm模型文件。
二、修改代码,适配打包后的路径
不能再直接用spacy.load("en_core_web_sm")了,得写个路径判断函数,让代码在开发环境和打包后的环境都能找到模型:
import spacy import sys import os def get_spacy_model_path(): # 处理PyInstaller打包后的临时运行目录 if hasattr(sys, '_MEIPASS'): return os.path.join(sys._MEIPASS, "models", "en_core_web_sm") # 开发时的本地路径 return os.path.join(os.path.dirname(__file__), "models", "en_core_web_sm") # 加载模型 nlp = spacy.load(get_spacy_model_path()) # 测试功能的示例代码 if __name__ == "__main__": test_text = "Hello, this is a sample sentence to test Spacy's POS tagging." doc = nlp(test_text) print("Token | Part of Speech") print("----------------------") for token in doc: print(f"{token.text:<6} | {token.pos_}")
把这段代码保存为spacy_demo.py。
三、用PyInstaller打包的正确命令
关键是要告诉PyInstaller把models文件夹里的模型一起打包进去,用--add-data参数:
- Mac/Linux系统:
pyinstaller --onefile --add-data "models/en_core_web_sm:models/en_core_web_sm" spacy_demo.py
- Windows系统:
pyinstaller --onefile --add-data "models/en_core_web_sm;models/en_core_web_sm" spacy_demo.py
--onefile是打包成单个可执行文件,如果你想要文件夹形式的打包结果,可以去掉这个参数。
四、测试打包后的程序
打包完成后,去dist文件夹里找到生成的可执行文件(Windows是.exe,Mac是.app或者直接可执行文件),运行它,你应该能看到正确的词性标注输出,再也不会出现“找不到模型”的错误了!
几个要注意的坑点
- 千万不要用模型的别名(比如
en_core_web_sm的别名en)加载,必须用完整的本地路径 - 确保
--add-data里的源路径和你存放模型的实际路径完全一致 - 如果模型更新了,记得重新下载到
models文件夹,再重新打包
内容的提问来源于stack exchange,提问作者user16467361
相关产品推荐
相关产品推荐

