Installo molti degli stessi pacchetti in diversi ambienti virtualenv . Esiste un modo per scaricare una volta un pacchetto e quindi installare pip da una cache locale?
Ciò ridurrebbe la larghezza di banda e il tempo di download.
Installo molti degli stessi pacchetti in diversi ambienti virtualenv . Esiste un modo per scaricare una volta un pacchetto e quindi installare pip da una cache locale?
Ciò ridurrebbe la larghezza di banda e il tempo di download.
Risposte:
Secondo la documentazione Pip :
A partire dalla v6.0, pip fornisce una cache attiva di default che funziona in modo simile a quella di un browser web. Mentre la cache è attiva per impostazione predefinita ed è progettata per fare la cosa giusta per impostazione predefinita, è possibile disabilitare la cache e accedere sempre a PyPI utilizzando l'
--no-cache-dir
opzione.
Pertanto, la risposta aggiornata è utilizzare solo pip con i suoi valori predefiniti se si desidera una cache di download.
Dalle notizie pip , versione 0.1.4:
Aggiunto supporto per una variabile ambientale $ PIP_DOWNLOAD_CACHE che memorizzerà nella cache i download dei pacchetti, quindi le installazioni future non richiederanno download di grandi dimensioni. L'accesso alla rete è ancora necessario, ma solo alcuni download saranno evitati quando si utilizza questo.
Per trarne vantaggio, ho aggiunto quanto segue al mio ~/.bash_profile
:
export PIP_DOWNLOAD_CACHE=$HOME/.pip_download_cache
oppure, se sei su un Mac:
export PIP_DOWNLOAD_CACHE=$HOME/Library/Caches/pip-downloads
PIP_DOWNLOAD_CACHE
directory. Ad esempio, ora ho parecchi pacchetti Django.virtualenvs
sull'aereo, ma è comunque eccezionale.Secondo me, pip2pi
è una soluzione molto più elegante e affidabile per questo problema.
Dai documenti:
pip2pi crea un repository di pacchetti compatibile con PyPI dai requisiti pip
pip2pi
ti permette di creare il tuo indice PyPI usando due semplici comandi:
Per eseguire il mirroring di un pacchetto e di tutti i suoi requisiti, utilizzare 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
Per creare un indice del pacchetto dalla directory precedente:
$ 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
Per installare dall'indice creato nel passaggio 2., puoi semplicemente utilizzare:
pip install --index-url=file:///tmp/packages/simple/ httpie==0.2
Puoi persino eseguire il mirroring del tuo indice su un host remoto con pip2pi
.
pip2tgz
rileva se hai già scaricato il pacchetto nella directory designata, quindi se esegui la stessa linea di installazione o più linee di installazione che hanno dipendenze sovrapposte, scaricherà ogni pacchetto una sola volta.
Le versioni Pip più recenti ora memorizzano nella cache i download per impostazione predefinita. Vedi questa documentazione:
https://pip.pypa.io/en/stable/reference/pip_install/#caching
Creare un file di configurazione denominato ~/.pip/pip.conf
e aggiungere i seguenti contenuti:
[global]
download_cache = ~/.cache/pip
Su OS X, un percorso migliore da scegliere sarebbe ~/Library/Caches/pip
dato che segue la convenzione utilizzata da altri programmi OS X.
pip.conf
con un download_cache
ambiente che punti alla stessa directory di sistema.
PIP_DOWNLOAD_CACHE ha alcuni seri problemi. Ancora più importante, codifica il nome host del download nella cache, quindi l'utilizzo dei mirror diventa impossibile.
Il modo migliore per gestire una cache di download di pip consiste nel separare il passaggio "scarica il pacchetto" dal passaggio "installa il pacchetto". I file scaricati vengono comunemente chiamati "file sdist" (distribuzioni di origine) e li memorizzerò in una directory $ SDIST_CACHE.
I due passaggi finiscono per essere:
pip install --no-install --use-mirrors -I --download=$SDIST_CACHE <package name>
Che scaricherà il pacchetto e lo posizionerà nella directory indicata da $ SDIST_CACHE. Non installerà il pacchetto. E poi corri:
pip install --find-links=file://$SDIST_CACHE --no-index --index-url=file:///dev/null <package name>
Per installare il pacchetto nel tuo ambiente virtuale. Idealmente, $ SDIST_CACHE sarebbe commesso sotto il tuo controllo del codice sorgente. Durante la distribuzione in produzione, è necessario eseguire solo il secondo comando pip per installare i pacchetti senza scaricarli.
A partire dalla versione 6.0 , pip
ora esegue la propria memorizzazione nella cache:
- DEPRECATION
pip install --download-cache
epip wheel --download-cache
flag della riga di comando sono stati deprecati e la funzionalità rimossa. Poiché pip ora configura e utilizza automaticamente la sua cache HTTP interna che supplisce che--download-cache
le opzioni esistenti siano state rese non funzionali ma saranno comunque accettate fino alla loro rimozione in pip v8.0. Per ulteriori informazioni, consultare https://pip.pypa.io/en/latest/reference/pip_install.html#caching
Maggiori informazioni dal link sopra :
A partire dalla v6.0, pip fornisce una cache attiva di default che funziona in modo simile a quella di un browser web. Mentre la cache è attiva per impostazione predefinita ed è progettata per fare la cosa giusta per impostazione predefinita, è possibile disabilitare la cache e accedere sempre a PyPI utilizzando l'
--no-cache-dir
opzione.
pip wheel è un'opzione eccellente che fa quello che vuoi con la funzione extra di pre-compilare i pacchetti. Dai documenti ufficiali :
Costruisci ruote per un requisito (e tutte le sue dipendenze):
$ pip wheel --wheel-dir=/tmp/wheelhouse SomePackage
Ora la tua /tmp/wheelhouse
directory ha tutte le tue dipendenze precompilate, quindi puoi copiare la cartella su un altro server e installare tutto con questo comando:
$ pip install --no-index --find-links=/tmp/wheelhouse SomePackage
Si noti che non tutti i pacchetti saranno completamente portatili su tutte le macchine. Alcuni pacchetti saranno creati appositamente per la versione di Python, la distribuzione del sistema operativo e / o l'architettura hardware che stai utilizzando. Ciò verrà specificato nel nome del file, come -cp27-none-linux_x86_64
per CPython 2.7 su un Linux a 64 bit, ecc.
Usando solo pip (la mia versione è 1.2.1), puoi anche creare un repository locale come questo:
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
Nella prima chiamata di pip, i pacchetti dal file dei requisiti vengono cercati nel repository locale (solo) e quindi installati da lì. Se fallisce, pip recupera i pacchetti dalla sua posizione abituale (es. PyPI) e li scarica sul PIP_SDIST_INDEX
(ma non installa nulla!). La prima chiamata viene "ripetuta" per installare correttamente il pacchetto dall'indice locale.
( --download-cache
crea un nome file locale che è l'URL completo (con escape) e pip non può utilizzarlo come indice con --find-links
. --download-cache
utilizzerà il file memorizzato nella cache, se trovato. Potremmo aggiungere questa opzione alla seconda chiamata di pip, ma poiché l'indice funziona già come una specie di cache, non porta necessariamente molto. Sarebbe d'aiuto se il tuo indice viene svuotato, per esempio.)
C'è una nuova soluzione a questo chiamato pip-accel , un rimpiazzo drop-in pip
con la cache integrata.
Il programma pip-accel è un wrapper per pip, il gestore di pacchetti Python. Accelera l'utilizzo di pip per inizializzare gli ambienti virtuali Python dati uno o più file dei requisiti. Lo fa combinando i seguenti due approcci:
I download della distribuzione di origine vengono memorizzati nella cache e utilizzati per generare un indice locale di archivi di distribuzione di origine.
Le distribuzioni binarie vengono utilizzate per accelerare il processo di installazione delle dipendenze con componenti binari (come M2Crypto e LXML). Invece di ricompilare nuovamente queste dipendenze per ogni ambiente virtuale, le compiliamo una volta e memorizziamo il risultato nella cache come distribuzione binaria * .tar.gz.
Paylogic utilizza pip-accel per inizializzare rapidamente e in modo affidabile ambienti virtuali nella sua fattoria di slave a integrazione continua che eseguono costantemente unit test (questo è stato uno dei casi d'uso originali per i quali è stato sviluppato pip-accel). Lo usiamo anche sui nostri server di build.
Abbiamo visto circa 10 volte la velocità dal passaggio da pip
a pip-accel
.
Un'opzione più semplice è basket
.
Dato un nome di pacchetto, lo scaricherà e tutte le dipendenze in una posizione centrale; senza nessuno degli svantaggi della cache di pip. Questo è ottimo per l'uso offline.
È quindi possibile utilizzare questa directory come fonte per pip
:
pip install --no-index -f file:///path/to/basket package
Oppure easy_install
:
easy_install -f ~/path/to/basket -H None package
Puoi anche usarlo per aggiornare il carrello ogni volta che sei online.