You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 22:32:42