428 votes

Installation de paquets Python à partir d'un dossier du système de fichiers local vers virtualenv avec pip

Est-il possible d'installer des paquets avec pip à partir du système de fichiers local ?

J'ai couru python setup.py sdist pour mon paquet, qui a créé le fichier tar.gz approprié. Ce fichier est stocké sur mon système à /srv/pkg/mypackage/mypackage-0.1.0.tar.gz .

Maintenant, dans un environnement virtuel, je voudrais installer des paquets provenant soit de pypi, soit d'un emplacement local spécifique. /srv/pkg .

Est-ce possible ?

PS Je sais que je peux spécifier pip install /srv/pkg/mypackage/mypackage-0.1.0.tar.gz . Cela fonctionnera, mais je parle de l'utilisation de l'option /srv/pkg comme un autre endroit où pip pourrait chercher si je tapais pip install mypackage .

0 votes

Je cherchais à installer un paquet PyPi sans setup.py, à partir de la roue WHL, et il a été installé après que j'ai téléchargé une version correcte pour ma version de Python, et que j'ai couru pip install <Path-to-WHL-file> .

18voto

Janusz Skonieczny Points 1587

Une option --find-links fait le travail et il fonctionne à partir de requirements.txt fichier !

Vous pouvez placer les archives de paquets dans un dossier et prendre le dernier paquet sans modifier le fichier d'exigences, par exemple requirements :

.
requirements.txt
requirements
    foo_bar-0.1.5-py2.py3-none-any.whl
    foo_bar-0.1.6-py2.py3-none-any.whl
    wiz_bang-0.7-py2.py3-none-any.whl
    wiz_bang-0.8-py2.py3-none-any.whl
    base.txt
    local.txt
    production.txt

Maintenant dans requirements/base.txt mettre :

--find-links=requirements
foo_bar
wiz_bang>=0.8

Un moyen efficace de mettre à jour les paquets propriétaires, il suffit de déposer un nouveau paquet dans le dossier.

De cette façon, vous pouvez installer des paquets à partir de local folder ET pypi avec le même appel unique : pip install -r requirements/production.txt

PS. Voir mon paquet cookiecutter-djangopackage pour voir comment diviser les exigences et utiliser une organisation des exigences basée sur des dossiers.

9voto

marquicus Points 121

En supposant que vous avez virtualenv et une requirements.txt vous pouvez alors définir dans ce fichier où obtenir les paquets :

# Published pypi packages 
PyJWT==1.6.4
email_validator==1.0.3
# Remote GIT repo package, this will install as django-bootstrap-themes
git+https://github.com/marquicus/django-bootstrap-themes#egg=django-bootstrap-themes
# Local GIT repo package, this will install as django-knowledge
git+file:///soft/SANDBOX/python/django/forks/django-knowledge#egg=django-knowledge

8voto

Schollii Points 8020

Pour installer uniquement à partir du local, vous avez besoin de 2 options :

  • --find-links : où chercher les dépendances. Il n'y a pas besoin de l'option file:// préfixe mentionné par d'autres.
  • --no-index : ne pas chercher dans les index pypi les dépendances manquantes (dépendances non installées et ne figurant pas dans le fichier --find-links chemin).

Ainsi, vous pourriez exécuter à partir de n'importe quel dossier les éléments suivants :

pip install --no-index --find-links /srv/pkg /path/to/mypackage-0.1.0.tar.gz

Si votre mypackage est correctement configuré, il listera toutes ses dépendances, et si vous avez utilisé pip download pour télécharger la cascade de dépendances (c'est-à-dire les dépendances des dépendances, etc.), tout fonctionnera.

Si vous voulez utiliser l'index pypi s'il est accessible, mais revenir aux roues locales si ce n'est pas le cas, vous pouvez supprimer l'élément suivant --no-index et ajouter --retries 0 . Vous verrez que pip s'arrête un peu pendant qu'il essaie de vérifier dans pypi s'il n'y a pas de dépendance manquante (une dépendance qui n'est pas installée) et lorsqu'il constatera qu'il ne peut pas l'atteindre, il se rabattra sur les dépendances locales. Il ne semble pas y avoir de moyen de dire à pip de "chercher d'abord les dépendances locales, puis l'index".

7voto

ups Points 120

Avoir des exigences en requirements.txt y egg_dir comme un répertoire

vous pouvez construire votre cache local :

$ pip download -r requirements.txt -d eggs_dir

ensuite, l'utilisation de ce "cache" est simple comme bonjour :

$ pip install -r requirements.txt --find-links=eggs_dir

0voto

J'ai essayé de réaliser quelque chose de très simple et j'ai échoué lamentablement, probablement parce que je suis stupide.

Quoi qu'il en soit, si vous avez un script/ Dockerfile qui télécharge un fichier zip d'un paquetage python (par exemple à partir de GitHub) et que vous souhaitez ensuite l'installer, vous pouvez utiliser la commande file:/// pour l'installer comme indiqué dans le tableau suivant exemple :

$ wget https://example.com/mypackage.zip
$ echo "${MYPACKAGE_MD5}  mypackage.zip" | md5sum --check -
$ pip install file:///.mypackage.zip

NOTE : Je sais que vous pouvez installer le paquet directement en utilisant pip install https://example.com/mypackage.zip mais dans mon cas, j'ai voulu vérifier la somme de contrôle (je ne suis jamais assez paranoïaque) et j'ai échoué lamentablement en essayant d'utiliser les différentes options fournies par pip/la fonction #md5 fragment.

Il a été étonnamment frustrant de faire quelque chose de si simple directement avec pip . Je voulais juste passer une somme de contrôle et avoir pip vérifier que le zip correspondait avant l'installer.

J'ai probablement fait quelque chose de très stupide, mais j'ai fini par abandonner et opter pour cette solution. J'espère que cela aidera d'autres personnes qui essaient de faire quelque chose de similaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X