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.
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.
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
PIP_DOWNLOAD_CACHE
. Par exemple, j'ai maintenant pas mal de paquets Django. virtualenvs
dans l'avion, mais c'est quand même génial.À 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:
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
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
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
.
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
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.
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.
À partir de version 6.0 , pip
fait maintenant sa propre mise en cache:
- OBSOL&EGRAVE;TE
pip install --download-cache
etpip 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
.
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.
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.)
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.
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
.
Je pense que le paquet "pip-accel" doit être un bon choix.