在setup.py中使用spaCy和spaCy模型

22

在我的项目中,我在setup.py中将spaCy作为依赖项,但我想添加一个默认模型。

到目前为止,我的尝试是:

install_requires=['spacy', 'en_core_web_sm'],
dependency_links=['https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-2.0.0/en_core_web_sm-2.0.0.tar.gz#egg=en_core_web_sm'],

在我的 setup.py 中,但是无论是常规的 pip install 还是 pip install --process-dependency-links 都返回:

pip._internal.exceptions.DistributionNotFound: No matching distribution found for en_core_web_sm (from mypackage==0.1)

我在AllenAI的Github问题页面上发现了与此相同的问题,但没有解决方案。
请注意,如果我直接使用模型的URL进行pip install,那么它可以正常工作,但我想在使用pip install安装我的软件包时将其作为依赖项安装。
3个回答

24

您可以使用pip对PEP 508 URL要求的最新支持:

install_requires=[
    'spacy',
    'en_core_web_sm @ https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-2.0.0/en_core_web_sm-2.0.0.tar.gz',
],

请注意,这要求您使用最新版本的setuptools和wheel构建项目(至少需要wheel v0.32.0;不确定setuptools),并且仅当用户使用至少pip 18.1版本时才能安装您的项目。
然而,更重要的是,如果您打算在PyPI上分发您的软件包,这不是可行的解决方案; 引用pip的发行说明

为了安全起见,如果从PyPI安装依赖于未在PyPI上托管的软件包,pip将引发异常。将来,PyPI将直接阻止上传具有此类外部URL依赖项的软件包。


谢谢你的回答。我测试了一下,它确实很好用。不过我还是不会采用它,因为我计划在PyPI上发布这个包,但无论如何我都会标记它为正确的答案。你对于一个PyPI包有什么建议吗?我在考虑是否要捕获spaCy的FileNotFoundError并打印一个错误信息,建议使用python -m spacy download en来解决,这会是一个好的折中方案吗? - w4nderlust

21
这是我针对可在PyPi上安装的软件包的解决方案(为了更清晰,稍作编辑):
try:
    nlp = spacy.load('en')
except OSError:
    print('Downloading language model for the spaCy POS tagger\n'
        "(don't worry, this will only happen once)", file=stderr)
    from spacy.cli import download
    download('en')
    nlp = spacy.load('en')

虽然有些麻烦,但至少不需要涉及用户即可正常工作。我正在尝试说服spaCy团队将最重要的模型文件打包到PyPi中。


1
看起来这可能是在 PyPI 上发布的唯一解决方案,因为 此问题 已经关闭。 - Garrett

1

不确定这是否适用于您,但是在 setup.py 中,您可以尝试以下操作:

os.system('python -m spacy download en')

在调用 setuptools.setup(...) 之后。

编辑

根据spaCy文档,现在看起来您也可以通过URL将SpaCy模型添加到您的 requirements.txt 中。然后,在需要该模型的地方,您应该能够将其作为一个模块导入:

import en_core_web_sm
nlp = en_core_web_sm.load()

参考:https://spacy.io/usage/models


我尝试了,但似乎不起作用。我使用pip uninstall从本地环境中删除了mypackage和spaCy,然后再次使用pip install安装了mypackage,它安装了mypackage和spaCy,但是从python解释器中,import spacy可以正常工作,而spacy.load('en')则不行:FileNotFoundError: [Errno 2] No such file or directory: '/home/piero/dev/venv3/local/lib/python3.6/site-packages/spacy/data/en/__init__.py'。所以我猜测pip没有运行setup.py中的附加行。 - w4nderlust
不确定您是否看到了这个讨论,但它可能会有所帮助:https://github.com/explosion/spaCy/issues/2676 - Wes Doyle
1
感谢您的补充评论和编辑,Wes。我实际上已经通过pip安装了模型,而不是通常的 python -m spacy download en,但它在 setup.py 中不能直接工作,您需要按照@jwodder所描述的方式进行操作,但很遗憾这种方式在PyPI中无法工作。 - w4nderlust

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接