Dans mon projet, j'ai spaCy comme dépendance dans mon setup.py, mais je veux également ajouter un modèle par défaut.

Jusqu'à présent, ma tentative a été:

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'],

Dans mon setup.py, mais à la fois un pip install régulier de mon colis et un pip install --process-dependency-links retour:

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

J'ai trouvé ce problème github d'AllenAI avec le même problème et aucune solution.

Notez que si je pip install l'url du modèle directement, cela fonctionne bien, mais je veux l'installer en tant que dépendance lorsque mon package est installé avec pip install.

13
w4nderlust 20 nov. 2018 à 01:09

3 réponses

Meilleure réponse

Vous pouvez utiliser la prise en charge récente de pip pour les exigences d'URL PEP 508:

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',
],

Notez que cela vous oblige à construire votre projet avec des versions à jour de setuptools et wheel (au moins v0.32.0 pour wheel; vous n'êtes pas sûr de setuptools), et vos utilisateurs ne pourront installer votre projet que s'ils sont en utilisant au moins la version 18.1 de pip.

Plus important encore, cependant, ce n'est pas une solution viable si vous avez l'intention de distribuer votre package sur PyPI; citant les notes de publication de pip:

Par mesure de sécurité, pip lèvera une exception lors de l'installation de packages à partir de PyPI si ces packages dépendent de packages qui ne sont pas également hébergés sur PyPI. À l'avenir, PyPI bloquera directement le téléchargement des packages avec de telles dépendances d'URL externes.

8
jwodder 19 nov. 2018 à 22:42

Je ne sais pas si cela fonctionne pour vous, mais dans setup.py, vous pouvez essayer:

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

Après avoir appelé setuptools.setup(...)

modifier :

Selon la documentation de spaCy, il semble que vous pouvez désormais ajouter des modèles SpaCy à votre requirements.txt via l'URL. Vous devriez alors pouvoir importer le modèle en tant que module là où il est requis:

import en_core_web_sm
nlp = en_core_web_sm.load()

Réf: https://spacy.io/usage/models

0
Wes Doyle 21 nov. 2018 à 22:14

Voici ma solution de contournement pour un package installable dans PyPi (édité légèrement pour plus de clarté):

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')

C'est lourd, mais au moins ça marche sans avoir à impliquer l'utilisateur. J'essaie de convaincre l'équipe spaCy de regrouper les fichiers de modèle les plus importants pour PyPi.

7
Christian Siefkes 16 avril 2019 à 09:11