如何在pyproject.toml中配置spaCy模型以随pip安装自动下载?
实现spaCy模型在包安装时自动下载的两种方案
方案一:直接将模型作为依赖添加(推荐)
spaCy模型可通过wheel URL直接作为pip依赖,让pip在安装你的包时自动下载并安装模型,完全遵循标准依赖管理流程。
- 确认与你的spaCy版本兼容的模型版本(例如spaCy 3.7.x对应模型3.7.x)
- 在
pyproject.toml的[project]部分,将模型的wheel链接加入依赖列表:
[project] name = "你的包名" version = "0.1.0" dependencies = [ "spacy>=3.7.0,<3.8.0", # 匹配你的spaCy版本范围 "en_core_web_sm @ https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.7.1/en_core_web_sm-3.7.1-py3-none-any.whl" ]
注意:替换链接中的版本号为你需要的对应版本,务必保证与spaCy版本兼容。
这种方式的优势:模型会被pip纳入依赖管理,卸载你的包时可选择一并卸载模型,安装过程更稳定可控。
方案二:使用安装后钩子脚本(适合动态场景)
如果需要在安装完成后自动执行spacy download命令,可通过setuptools的安装钩子实现:
- 在你的包目录下创建
install_utils.py文件,内容如下:
from setuptools.command.install import install import subprocess import sys class PostInstallHook(install): def run(self): # 先执行标准安装流程 install.run(self) # 下载spaCy模型 try: subprocess.run( [sys.executable, "-m", "spacy", "download", "en_core_web_sm"], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True ) print("Successfully downloaded en_core_web_sm model.") except subprocess.CalledProcessError as e: print(f"Warning: Failed to download en_core_web_sm model. Error: {e.stderr}", file=sys.stderr)
- 在
pyproject.toml中配置setuptools的命令类,指定使用自定义的安装钩子:
[tool.setuptools] cmdclass = { install = "你的包名.install_utils.PostInstallHook" }
注意:将
你的包名替换为实际的包名称,确保install_utils.py在包的可导入路径下。
这种方式的局限性:模型不会被pip作为依赖跟踪,卸载你的包时模型不会自动移除;若用户使用pip install --no-deps等特殊参数,钩子可能无法触发。
额外注意事项
- 必须保证spaCy版本与模型版本兼容,否则会出现运行时错误
- 如需支持多个模型,可在依赖列表中添加多个wheel链接,或在钩子脚本中执行多个
spacy download命令
内容的提问来源于stack exchange,提问作者jblake1965
相关产品推荐
相关产品推荐

