Python setup.py中的空间和空间模型

Python setup.py中的空间和空间模型,python,setup.py,spacy,Python,Setup.py,Spacy,在我的项目中,我在我的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_

在我的项目中,我在我的
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安装和
pip安装--进程依赖链接返回:

pip._internal.exceptions.DistributionNotFound: No matching distribution found for en_core_web_sm (from mypackage==0.1)
我发现这与同样的问题,没有解决办法


请注意,如果我直接使用
pip安装
模型的url,它可以正常工作,但是当我的软件包使用
pip安装
安装时,我希望将其作为依赖项安装,但不确定这是否适用于您,但在
setup.py
中,您可以尝试:

os.system('python-mspacy下载en')

调用
setuptools.setup(…)

编辑

根据spaCy docs,您现在似乎也可以通过url将spaCy模型添加到requirements.txt中。然后,您应该能够将模型作为需要的模块导入:

import en_core_web_sm
nlp = en_core_web_sm.load()

参考:

您可以使用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不确定)构建项目,并且您的用户只有在使用至少18.1版的pip时才能安装项目

但是,更重要的是,如果您打算在PyPI上分发包,那么这不是一个可行的解决方案:

作为安全措施,如果从PyPI安装的包依赖于不在PyPI上托管的包,则pip将在安装这些包时引发异常。将来,PyPI将阻止直接上载具有此类外部URL依赖项的包

以下是我对PyPi可安装软件包的建议(为清晰起见,略加编辑):


这很麻烦,但至少它可以在不需要用户参与的情况下工作。我正试图说服spaCy团队为PyPi打包最重要的模型文件。

我尝试过,但似乎不起作用。我使用pip卸载从本地环境中删除了mypackage和spaCy,然后使用
pip install
再次安装了mypackage,它安装了mypackage和spaCy,但是从python解释器中导入spaCy可以正常工作,而
spaCy.load('en')
没有:
FileNotFoundError:[Errno 2]没有这样的文件或目录:'/home/piero/dev/venv3/local/lib/python3.6/site-packages/spacy/data/en/\uuuu-init\uuuuu.py'
。因此,我猜pip没有运行
setup.py
中的附加行。不确定您是否看过此讨论,但它可能会有所帮助:感谢您的附加评论和编辑Wes。实际上,我已经通过pip安装了模型,而不是通常的
python-mspacy下载en
,但是它不能直接在
setup.py
中工作,您需要按照@jwodder所描述的方式进行安装,不幸的是,这种方式不适用于PyPI。谢谢您的回答。我测试了它,它实际上工作得很好。我无论如何都不会采用它,因为我计划在PyPI上发布这个包,但无论如何都会标记为正确的。对于PyPI包,您建议做什么?我正在考虑捕获spaCy的
FileNotFoundError
并打印一条错误消息,建议运行
python-msapacy下载en
,这是一个好的折衷方案吗?事实上,鉴于PyPI已经关闭,这可能是在一段时间内发布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')