147 votes

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

J'installe beaucoup de paquets identiques dans des endroits différents. virtualenv environnements. Existe-t-il un moyen de télécharger un paquet une seule fois et d'avoir ensuite pip installer à partir d'un cache local ?

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

1 votes

Notez qu'à partir de pip 6.0 (2014-12-22), pip met en cache par défaut. Voir pip.pypa.io/en/stable/reference/pip_install.html#caching pour les détails.

0 votes

Cela ne réduit pas seulement le temps de téléchargement de la bande passante, cela peut aussi éliminer le temps passé à parcourir l'index PyPI pour vérifier les versions disponibles des paquets, et si vous mettez en cache des roues, cela peut éliminer le temps passé à construire des roues pour des paquets qui ne les fournissent pas. Cela représente un gain de vitesse très important.

127voto

Matthew Rankin Points 71628

Réponse mise à jour le 19-Nov-15

Selon le Documentation sur les pip :

À partir de la version 6.0, pip fournit un cache activé par défaut qui fonctionne de manière similaire à celui d'un navigateur web. Bien que le cache soit activé par défaut et qu'il soit conçu pour faire la bonne chose par défaut, vous pouvez désactiver le cache et toujours accéder à PyPI en utilisant la fonction --no-cache-dir option.

Par conséquent, la réponse actualisée est d'utiliser pip avec ses valeurs par défaut si vous voulez un cache de téléchargement.

Réponse originale

De la Nouvelles des pépins 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 paquets, de sorte que les installations futures ne nécessiteront pas de gros téléchargements. L'accès au réseau est toujours nécessaire, mais certains téléchargements seront évités en utilisant cette variable.

Pour en tirer parti, j'ai ajouté les éléments suivants à ma base de données de l'UE ~/.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

Notes

  1. Si une version plus récente d'un paquet est détectée, elle sera téléchargée et ajoutée à la liste des paquets. PIP_DOWNLOAD_CACHE répertoire. Par exemple, j'ai maintenant un certain nombre de paquets Django.
  2. Cela ne supprime pas la nécessité d'un accès au réseau, comme indiqué dans le Nouvelles des pépins Il ne s'agit donc pas d'une solution pour la création d'une nouvelle virtualenvs dans l'avion, mais c'est quand même génial.

4 votes

La meilleure idée est peut-être de le mettre dans .bashrc, car bash_profile n'est exécuté que lors de la connexion. C'est à vous de voir, et de toute façon c'est un bon conseil :)

1 votes

Sur les Macs, il est chargé au début de tout shell.

3 votes

PIP_DOWNLOAD_CACHE est sérieusement défectueux et je ne recommanderais pas de l'utiliser pour des choses comme l'envoi de paquets à vos machines de déploiement. De plus, il dépend toujours de l'accessibilité de pypi.python.org. Parfait pour un cache de développement local, mais pas pour des utilisations plus lourdes.

53voto

Kay Zhu Points 9703

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

Dans la documentation :

pip2pi construit un dépôt de paquets compatible avec PyPI à partir des exigences de pip.

pip2pi vous permet de créer votre propre index PyPI à l'aide de deux commandes simples :

  1. Pour créer un miroir d'un paquet et de 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 paquet à 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 que vous avez construit à l'étape 2, vous pouvez simplement utiliser :

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

Vous pouvez même créer un miroir de votre propre index sur un hôte distant avec pip2pi .

0 votes

+1 pip2pip fonctionne très bien ! Je n'aime pas trop dépendre de la connectivité du réseau. Elle échoue quand on en a le plus besoin.

0 votes

cela fonctionne très bien, cela répond à ma question stackoverflow.com/questions/18052217/ pouvez-vous y répondre également ?

1 votes

C'était peut-être implicite, mais ça vaut la peine de le mentionner explicitement : pip2tgz détecte si vous avez déjà téléchargé le paquet dans le répertoire désigné, ainsi si vous exécutez la même ligne d'installation ou plusieurs lignes d'installation qui ont des dépendances qui se chevauchent, il ne téléchargera chaque paquet qu'une seule fois.

32voto

Flimm Points 8870

Pour les versions plus récentes de Pip :

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

https://pip.pypa.io/en/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

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

0 votes

Et si je voulais les stocker globalement pour que les autres utilisateurs du même PC puissent y accéder ? Comment dois-je m'y prendre ? Je pense que le fichier de configuration devrait être placé dans le répertoire /etc ou quelque chose comme ça.

0 votes

@batandwa : Cela pourrait fonctionner. Sinon, vous pouvez essayer ceci : assurez-vous que tous les utilisateurs ont un numéro d'identification de l'utilisateur. pip.conf avec un download_cache qui pointe vers le même répertoire du système.

30voto

slacy Points 4417

PIP_DOWNLOAD_CACHE a de sérieux problèmes. Le plus important est qu'il encode le nom d'hôte du téléchargement dans le cache, ce qui rend l'utilisation des miroirs impossible.

La meilleure façon de gérer un cache de téléchargements de pip est de séparer l'étape "télécharger le paquet" de l'étape "installer le paquet". Les fichiers téléchargés sont communément appelés "fichiers sdist" (distributions des 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 va télécharger le paquet et le placer dans le répertoire pointé par $SDIST_CACHE. Il n'installera pas le paquet. Et ensuite vous exécutez :

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

Pour installer le paquet dans votre environnement virtuel. Idéalement, $SDIST_CACHE devrait être validé sous votre contrôle de source. Lors du déploiement en production, vous n'exécuterez que la deuxième commande pip pour installer les paquets sans les télécharger.

0 votes

Gabriel -- Il n'est pas téléchargé deux fois, juste une fois dans la première étape et ensuite installé à partir du cache local dans la seconde. Qu'est-ce que vous voyez ?

0 votes

Si j'exécute la première étape deux fois, ça va le télécharger deux fois, non ? C'est en tout cas ce qui s'est passé ici. Je dois savoir si la première étape a été exécutée au moins une fois pour ce paquet avant de l'exécuter, sinon le même fichier sera téléchargé deux fois. Comment puis-je vérifier si je dois l'exécuter ou s'il a déjà été téléchargé ?

0 votes

Vous voulez probablement utiliser pip2pi comme le suggère l'autre réponse :)

3voto

user1010997 Points 78

En utilisant uniquement pip (ma version est 1.2.1), vous pouvez aussi construire un dépôt 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 paquets du fichier d'exigences sont recherchés dans le dépôt local (uniquement), puis installés à partir de là. Si cela échoue, pip récupère les paquets à partir de son emplacement habituel (par exemple PyPI) et les télécharge dans le répertoire de l'utilisateur. PIP_SDIST_INDEX (mais n'installe rien !). Le premier appel est "répété" pour installer correctement le paquet à partir de l'index local.

( --download-cache crée un nom de fichier local qui correspond à l'URL complète (échappée), et pip ne peut pas l'utiliser comme index avec la commande --find-links . --download-cache utilisera le fichier en cache, s'il est trouvé. On pourrait ajouter cette option au second appel de pip, mais comme l'index fonctionne déjà comme une sorte de cache, cela n'apporte pas forcément grand chose. Cela aiderait si votre index est vidé, par exemple).

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