web-dev-qa-db-fra.com

Comment installer à partir d'un cache local avec pip?

J'installe beaucoup des mêmes packages dans différents environnements virtualenv . Est-il possible de télécharger un paquet une fois, puis d’avoir pip install depuis un cache local? 

Cela réduirait la bande passante et le temps de téléchargement.

132
Matthew Rankin

Réponse mise à jour 19-nov-15

Selon la Documentation Pip :

À partir de la version 6.0, pip fournit un cache activé par défaut qui fonctionne de la même manière que celui d'un navigateur Web. Lorsque le cache est activé par défaut et qu'il est conçu, vous pouvez le désactiver par défaut et toujours accéder à PyPI en utilisant l'option --no-cache-dir.

Par conséquent, la réponse mise à jour consiste simplement à utiliser pip avec ses valeurs par défaut si vous souhaitez un cache de téléchargement.

Réponse originale

De la pip news , version 0.1.4:

Ajout de la prise en charge d’une variable d’environnement $ PIP_DOWNLOAD_CACHE qui mettra en cache les téléchargements de packages, afin que les installations futures n’exigent pas de téléchargements volumineux. L'accès au réseau est toujours requis, mais certains téléchargements seront évités si vous l'utilisez.

Pour en tirer parti, j'ai ajouté ce qui suit à mon ~/.bash_profile:

export PIP_DOWNLOAD_CACHE=$HOME/.pip_download_cache

ou, si vous êtes sur un Mac:

export PIP_DOWNLOAD_CACHE=$HOME/Library/Caches/pip-downloads

Remarques

  1. Si une version plus récente d'un paquet est détectée, il sera téléchargé et ajouté au répertoire PIP_DOWNLOAD_CACHE. Par exemple, j'ai maintenant pas mal de paquets Django. 
  2. Ceci ne supprime pas le besoin d'accès au réseau, comme indiqué dans pip news , ce n'est donc pas la solution pour créer une nouvelle virtualenvs dans l'avion, mais c'est quand même génial.
121
Matthew Rankin

À mon avis, pip2pi est une solution beaucoup plus élégante et fiable pour résoudre ce problème.

De la docs:

pip2pi construit un référentiel de paquet compatible PyPI à partir des exigences pip

pip2pi vous permet de créer votre propre index PyPI en utilisant deux commandes simples:

  1. Pour mettre en miroir un paquet et toutes ses exigences, utilisez pip2tgz:

    $ cd /tmp/; mkdir package/
    $ pip2tgz packages/ httpie==0.2
    ...
    $ ls packages/
    Pygments-1.5.tar.gz
    httpie-0.2.0.tar.gz
    requests-0.14.0.tar.gz
    
  2. Pour construire un index de package à partir du répertoire précédent:

    $ ls packages/
    bar-0.8.tar.gz
    baz-0.3.tar.gz
    foo-1.2.tar.gz
    $ dir2pi packages/
    $ find packages/
    /httpie-0.2.0.tar.gz
    /Pygments-1.5.tar.gz
    /requests-0.14.0.tar.gz
    /simple
    /simple/httpie
    /simple/httpie/httpie-0.2.0.tar.gz
    /simple/Pygments
    /simple/Pygments/Pygments-1.5.tar.gz
    /simple/requests
    /simple/requests/requests-0.14.0.tar.gz
    
  3. Pour installer à partir de l'index créé à l'étape 2., vous pouvez simplement utiliser:

    pip install --index-url=file:///tmp/packages/simple/ httpie==0.2
    

Vous pouvez même mettre en miroir votre propre index sur un hôte distant avec pip2pi.

50
K Z

Pour les nouvelles versions de Pip:

Les versions plus récentes de Pip mettent désormais en cache les téléchargements par défaut. Voir cette documentation:

https://pip.pypa.io/fr/stable/reference/pip_install/#caching

Pour les anciennes versions de Pip:

Créez un fichier de configuration nommé ~/.pip/pip.conf et ajoutez le contenu suivant:

[global]
download_cache = ~/.cache/pip

Sur OS X, le meilleur chemin à choisir serait ~/Library/Caches/pip puisqu'il suit la convention utilisée par les autres programmes OS X.

30
Flimm

PIP_DOWNLOAD_CACHE a de sérieux problèmes. Plus important encore, il encode le nom d'hôte du téléchargement dans le cache, de sorte que l'utilisation de miroirs devient impossible. 

La meilleure façon de gérer un cache de téléchargements de pip consiste à séparer l'étape "télécharger le package" de l'étape "installer le package". Les fichiers téléchargés sont communément appelés "fichiers sdist" (distributions sources) et je vais les stocker dans un répertoire $ SDIST_CACHE. 

Les deux étapes finissent par être:

pip install --no-install --use-mirrors -I --download=$SDIST_CACHE <package name>

Ce qui téléchargera le paquet et le placera dans le répertoire indiqué par $ SDIST_CACHE. Cela n'installe pas le paquet. Et puis tu cours: 

pip install --find-links=file://$SDIST_CACHE --no-index --index-url=file:///dev/null <package name> 

Pour installer le package dans votre environnement virtuel. Idéalement, $ SDIST_CACHE serait engagé sous votre contrôle de source. Lors du déploiement en production, vous n'exécutez que la deuxième commande pip pour installer les packages sans les télécharger. 

28
slacy

À partir de version 6.0 , pip fait maintenant sa propre mise en cache:

  • OBSOL&EGRAVE;TEpip install --download-cache et pip wheel --download-cache Les indicateurs de ligne de commande sont obsolètes et la fonctionnalité supprimée. Depuis que pip configure et utilise automatiquement son cache HTTP interne qui supplante le --download-cache, les options existantes ont été rendues non fonctionnelles mais seront toujours acceptées jusqu’à leur suppression dans pip v8.0. Pour plus d'informations, veuillez consulter https://pip.pypa.io/en/latest/reference/pip_install.html#caching

Plus d'informations sur le lien ci-dessus :

À partir de la version 6.0, pip fournit un cache activé par défaut qui fonctionne de la même manière que celui d'un navigateur Web. Lorsque le cache est activé par défaut et qu'il est conçu, vous pouvez le désactiver par défaut et toujours accéder à PyPI en utilisant l'option --no-cache-dir.

12
Jace Browning

pip wheel est une excellente option qui fait ce que vous voulez avec la fonctionnalité supplémentaire de pré-compilation des paquets. De la documents officiels :

Construisez des roues pour un besoin (et toutes ses dépendances):

$ pip wheel --wheel-dir=/tmp/wheelhouse SomePackage

Maintenant, votre répertoire /tmp/wheelhouse contient toutes vos dépendances précompilées. Vous pouvez donc copier le dossier sur un autre serveur et tout installer à l'aide de cette commande:

$ pip install --no-index --find-links=/tmp/wheelhouse SomePackage

Notez que tous les packages ne seront pas complètement portables sur toutes les machines. Certains packages seront spécialement conçus pour la version Python, la distribution de système d'exploitation et/ou l'architecture matérielle que vous utilisez. Cela sera spécifié dans le nom du fichier, comme -cp27-none-linux_x86_64 pour CPython 2.7 sur un Linux 64 bits, etc.

8
hdiogenes

En utilisant pip uniquement (ma version est 1.2.1), vous pouvez également créer un référentiel local comme ceci:

if ! pip install --find-links="file://$PIP_SDIST_INDEX" --no-index <package>; then
    pip install --download-directory="$PIP_SDIST_INDEX" <package>
    pip install --find-links="file://$PIP_SDIST_INDEX" --no-index <package>
fi

Lors du premier appel de pip, les packages du fichier de exigences sont recherchés dans le référentiel local (uniquement), puis installés à partir de celui-ci. Si cela échoue, pip récupère les paquets à partir de leur emplacement habituel (par exemple, PyPI) et les télécharge dans le PIP_SDIST_INDEX (sans rien installer!). Le premier appel est "répété" pour installer correctement le package à partir de l'index local.

(--download-cache crée un nom de fichier local qui correspond à l'URL complète (échappée). pip ne peut pas l'utiliser comme index avec --find-links. --download-cache utilisera le fichier mis en cache, s'il est trouvé. comme l’index fonctionne déjà comme une sorte de cache, cela n’apporte pas forcément beaucoup, cela aiderait si votre index est vidé, par exemple.)

3
user1010997

Une option plus simple est basket .

Étant donné le nom du paquet, il le téléchargera avec toutes ses dépendances dans un emplacement central. sans aucun des inconvénients du cache pip. Ceci est idéal pour une utilisation hors ligne.

Vous pouvez ensuite utiliser ce répertoire en tant que source pour pip:

pip install --no-index -f file:///path/to/basket package

Ou easy_install:

easy_install -f ~/path/to/basket -H None package

Vous pouvez également l'utiliser pour mettre à jour le panier lorsque vous êtes en ligne.

2
Burhan Khalid

Il existe une nouvelle solution appelée pip-accel , une solution de remplacement pour pip avec la mise en cache intégrée.

Le programme pip-accel est un wrapper pour pip, le gestionnaire de paquets Python. Il accélère l’utilisation de pip pour initialiser les environnements virtuels Python à partir d’un ou plusieurs fichiers de configuration. Pour ce faire, il combine les deux approches suivantes:

  • Les téléchargements de la distribution source sont mis en cache et utilisés pour générer un index local des archives de la distribution source. 

  • Les distributions binaires sont utilisées pour accélérer le processus d'installation de dépendances avec des composants binaires (tels que M2Crypto et LXML). Au lieu de recompiler à nouveau ces dépendances pour chaque environnement virtuel, nous les compilons une fois et mettons le résultat en cache sous la forme d'une distribution binaire * .tar.gz.

Paylogic utilise pip-accel pour initialiser rapidement et de manière fiable les environnements virtuels de sa batterie d'esclaves à intégration continue exécutant en permanence des tests unitaires (il s'agissait de l'un des cas d'utilisation originaux pour lequel pip-accel a été développé). Nous l'utilisons également sur nos serveurs de build.

Nous avons constaté une vitesse multipliée par 10 par le passage de pip à pip-accel.

2
qris

Je pense que le paquet "pip-accel" doit être un bon choix.

0
lasthuman