web-dev-qa-db-fra.com

pip ignore les liens de dépendance dans setup.py

J'ai des liens de dépendance dans mon setup.py:

...
dependency_links = ['http://github.com/robot-republic/python-s3/tarball/master.tar.gz#Egg=python-s3'],
...

Mais ça ne marche pas. Cependant, install_requires fonctionne bien. Peut-être qu'il existe une autre méthode pour configurer git repo comme requis pour setup.py?

60
syabro

Cette réponse devrait aider. En un mot, vous devez spécifier la version (ou "dev") du #Egg=python-s3 donc ça ressemble à #Egg=python-s3-1.0.0.

Mises à jour basées sur le commentaire de @ Cerin:

  • Pip 1.5.x a un indicateur pour activer le traitement des liens de dépendance: --process-dependency-links . Je ne l'ai pas testé car je suis d'accord avec le point ci-dessous.
  • Cette discussion semble indiquer que l'utilisation de liens de dépendance pour pip est une mauvaise pratique. Bien que cette fonctionnalité ait été enrôlée pour dépréciation, elle ne l'est plus. Il existe un cas d'utilisation valide pour les packages privés.
57
Laur Ivan

Je me rends compte que c'est une vieille question, mais, au cas où vous vous trouveriez ici comme moi, c'est ce qui a fonctionné pour moi.

J'ai un package sur GitHub (non enregistré avec pypi) qui s'appuie sur d'autres packages GitHub (non-pypi). J'ai passé énormément de temps à essayer de comprendre comment obtenir pip pour gérer cela correctement. Je vais inclure ce que j'ai fait pour le réparer ici.

Placer les dépendances dans un fichier requirements.txt est la méthode préférée pour répertorier les dépendances. Cependant, vous devez également remplir install_requires dans la configuration. C'est à ce stade que j'ai rencontré un barrage routier avec pip ne voulant pas installer les dépendances de GitHub.

La plupart des endroits, y compris les réponses à cette question, vous indiquent de remplir la section dependency_links de l'installation. Cependant, vous devez également remplir le champ install_requires avec le nom du package référencé dans dependency_links.

Par exemple, si votre requirements.txt contient les éléments suivants.

somepackage==1.2.0
https://github.com/user/repo/tarball/master#Egg=repo-1.0.0
anotherpackage==4.2.1

Ensuite, votre appel d'installation devrait ressembler à ceci:

setup(
    name='yourpackage',
    version='1.7.5',
    packages=[],
    url='',
    license='',
    author='',
    author_email='',
    description='',
    install_requires=[
        'somepackage==1.2.0',
        'repo==1.0.0',
        'anotherpackage==4.2.1'
    ],
    dependency_links=[
        'https://github.com/user/repo/tarball/master#Egg=repo-1.0.0'
    ]
)

Ok, maintenant nous avons configuré notre package; son installation est la tâche suivante. C'est là que j'ai passé beaucoup de temps. Je ne pouvais pas comprendre pourquoi la spécification de dependency_links n'a apparemment rien fait. L'astuce est que dans certains cas, vous devez définir l'indicateur allow-all-external (peut être plus spécifique) pour pip. Par exemple:

pip install git+https://github.com/user/anotherrepo.git
--process-dependency-links --allow-all-external

Vous avez terminé et cela fonctionne!

AVERTISSEMENT: dependency_links et les indicateurs process-dependency-links et allow-all-external sont obsolètes, ils seront donc supprimés bientôt. Pendant le temps que j'ai passé, je n'ai pas pu trouver une meilleure méthode préférée et avoir toujours la fonction pip correctement.

43
Chad

depuis la version pip 18.1 RL PEP 508 est pris en charge. Cela signifie que vous n'avez plus besoin des liens de dépendance obsolètes. Vous écrivez plutôt la dépendance directement dans la liste install_requires. L'exemple de @Chad ressemble à ceci:

setup(
    name='yourpackage',
    version='1.7.5',
    packages=[],
    url='',
    license='',
    author='',
    author_email='',
    description='',
    install_requires=[
        'somepackage==1.2.0',
        'repo==1.0.0 @ https://github.com/user/archive/master.Zip#Egg=repo-1.0.0',
        'anotherpackage==4.2.1'
    ],
)

Pour installer votre package, vous pouvez simplement écrire:

pip install yourpackage

(sans --process-dependency-links)

16
Easy_Israel

Quelques notes sur certains problèmes que j'ai trouvés, en particulier pour l'installation à partir de dépôts privés.

L'installation à partir de pip & setuptools présente quelques différences subtiles; mais cette façon devrait fonctionner pour les deux.

from setuptools import setup
import os
# get deploy key from https://help.github.com/articles/git-automation-with-oauth-tokens/
github_token = os.environ['GITHUB_TOKEN']

setup(
    # ...
    install_requires='package',
    dependency_links = [
    'git+https://{github_token}@github.com/user/{package}.git/@{version}#Egg={package}-0'
        .format(github_token=github_token, package=package, version=master)
        ]

Quelques notes ici:

  • Pour les dépôts privés, vous devez vous authentifier avec GitHub; la manière la plus simple que j'ai trouvée est de créer un jeton oauth, déposez-le dans votre environnement, puis incluez-le avec l'URL
  • Vous devez inclure certains numéro de version (voici 0) à la fin du lien, même s'il n'y a pas de package sur PyPI. Ce doit être un nombre réel, pas un mot.
  • Vous devez faire précéder de git+ pour dire à setuptools de cloner le dépôt, plutôt que de pointer un Zip/tarball
  • version peut être une branche, une balise ou un hachage de validation
  • Vous devez fournir --process-dependency-links en cas d'installation à partir de pip
13
Maximilian

Mettez d'abord à niveau votre version pip car il s'agit d'une nouvelle syntaxe.

pip install pip --upgrade

Procédez ensuite comme suit:

install_requires=[
    'bleualign-git @ https://github.com/rsennrich/Bleualign/archive/<commit-hash or branch-name>.Zip#Egg=bleualign-git-1.0.0'
]
  • La version 1.0.0 et le nom "bluealign-git" sont choisis au hasard.
  • Le numéro de version est nécessaire.
  • Nous avons délibérément utilisé le nom "bleualign-git" pour le distinguer de la version principale du référentiel.

J'espère que cela t'aides.

Commentaires:

Bonne réponse (vote positif). Je tiens également à mentionner que le résultat réel dépendra probablement de la plate-forme et/ou de la version pip. J'ai vu quand cela fonctionne , ou semble fonctionner mais n'a pas vraiment tiré la dépendance du lien spécifié , ou simplement rejeté . Je n'utiliserais donc probablement cela que comme solution de contournement de courte durée. Restez fidèle à la manière traditionnelle autant que possible.

4
Tobias Ernst