Come si installa da una cache locale con pip?

Installo molti degli stessi pacchetti in diversi ambienti virtualenv . C’è un modo per scaricare un pacchetto una volta e poi installare pip da una cache locale?

Ciò ridurrebbe la larghezza di banda e il tempo di download.

Risposta aggiornata 19-Nov-15

Secondo la documentazione di Pip :

A partire dalla v6.0, pip fornisce una cache predefinita on che funziona in modo simile a quella di un browser web. Mentre la cache è triggers per impostazione predefinita e progettata per fare la cosa giusta per impostazione predefinita, puoi disabilitare la cache e accedere sempre a PyPI usando l’opzione --no-cache-dir .

Pertanto, la risposta aggiornata è di utilizzare semplicemente pip con i valori predefiniti se si desidera una cache di download.

Risposta originale

Dalle notizie di 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 grandi download. L’accesso alla rete è ancora richiesto, ma solo alcuni download saranno evitati quando si utilizza questo.

Per approfittare di questo, ho aggiunto quanto segue al mio ~/.bash_profile :

 export PIP_DOWNLOAD_CACHE=$HOME/.pip_download_cache 

o, se sei su un Mac:

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

Gli appunti

  1. Se viene rilevata una versione più recente di un pacchetto, questa verrà scaricata e aggiunta alla directory PIP_DOWNLOAD_CACHE . Ad esempio, ora ho un bel po ‘di pacchetti Django.
  2. Ciò non toglie la necessità di accesso alla rete, come affermato nelle news pip , quindi non è la risposta per la creazione di nuovi 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 di pip

pip2pi ti permette di creare il tuo indice PyPI usando due semplici comandi:

  1. Per pip2tgz mirror di un pacchetto e tutti i relativi 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 
  2. Per creare un indice di 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 
  3. Per installare dall’indice creato nel passaggio 2., puoi semplicemente utilizzare:

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

È persino ansible eseguire il mirroring del proprio indice su un host remoto con pip2pi .

Per le versioni Pip più recenti:

Le versioni di Pip più recenti ora nascondono i download per impostazione predefinita. Vedi questa documentazione:

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

Per le versioni Pip precedenti:

Crea un file di configurazione chiamato ~/.pip/pip.conf e aggiungi i seguenti contenuti:

 [global] download_cache = ~/.cache/pip 

Su OS X, un percorso migliore da scegliere sarebbe ~/Library/Caches/pip poiché segue la convenzione utilizzata da altri programmi OS X.

PIP_DOWNLOAD_CACHE ha alcuni problemi seri. Ancora più importante, codifica il nome host del download nella cache, quindi l’uso di mirror diventa imansible.

Il modo migliore per gestire una cache di download di pip consiste nel separare il passaggio “download del pacchetto” dal passaggio “installa il pacchetto”. I file scaricati vengono comunemente definiti “file sdist” (distribuzioni di origine) e io li memorizzerò in una directory $ SDIST_CACHE.

I due passaggi finiscono per essere:

 pip install --no-install --use-mirrors -I --download=$SDIST_CACHE  

Che scaricherà il pacchetto e lo inserirà 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  

Per installare il pacchetto nel tuo ambiente virtuale. Idealmente, $ SDIST_CACHE verrebbe eseguito sotto il controllo del codice sorgente. Quando si esegue la distribuzione in produzione, si esegue solo il secondo comando pip per installare i pacchetti senza scaricarli.

A partire dalla versione 6.0 , pip ora fa il proprio caching:

  • DEPRECATION pip install --download-cache e pip wheel --download-cache flag della riga di comando sono stati deprecati e la funzionalità rimossa. Poiché pip ora configura automaticamente e utilizza la sua cache HTTP interna che sostituisce il --download-cache le opzioni esistenti sono 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

Ulteriori informazioni dal link sopra :

A partire dalla v6.0, pip fornisce una cache predefinita on che funziona in modo simile a quella di un browser web. Mentre la cache è triggers per impostazione predefinita e progettata per fare la cosa giusta per impostazione predefinita, puoi disabilitare la cache e accedere sempre a PyPI usando l’opzione --no-cache-dir .

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 ha tutte le 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

Nota che non tutti i pacchetti saranno completamente portabili su tutte le macchine. Alcuni pacchetti verranno creati specificamente per la versione Python, la distribuzione del SO e / o l’architettura hardware che stai utilizzando. Questo sarà 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 ; then pip install --download-directory="$PIP_SDIST_INDEX"  pip install --find-links="file://$PIP_SDIST_INDEX" --no-index  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 lo scarica su PIP_SDIST_INDEX (ma non installa nulla!). La prima chiamata è “ripetuta” per installare correttamente il pacchetto dall’indice locale.

( --download-cache crea un nome di file locale che è l’URL completo (con escape) e pip non può usarlo come indice con --find-links . --download-cache userà il file memorizzato nella cache, se trovato. potrebbe aggiungere questa opzione alla seconda chiamata di pip, ma dato che l’indice funziona già come una sorta di cache, non necessariamente porta molto: sarebbe utile se l’indice fosse svuotato, per esempio.)

Un’opzione più semplice è il basket .

Dato un nome di pacchetto, lo scaricherà e tutte le dipendenze in una posizione centrale; senza alcuno svantaggio della cache di pip. Questo è ottimo per l’uso offline.

È quindi ansible utilizzare questa directory come origine per pip :

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

O easy_install :

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

Puoi anche usarlo per aggiornare il carrello ogni volta che sei online.

C’è una nuova soluzione a questo chiamato pip-accel , una sostituzione drop-in per pip con 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 di requisiti. Lo fa combinando i seguenti due approcci:

  • I download di distribuzione di origine vengono memorizzati nella cache e utilizzati per generare un indice locale di archivi di distribuzione di origine.

  • Le distribuzioni binarie sono 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 in una distribuzione binaria * .tar.gz.

Paylogic utilizza pip-accel per inizializzare in modo rapido e affidabile gli ambienti virtuali nella sua farm di slave di integrazione continua che eseguono costantemente test di unità (questo era uno dei casi d’uso originali per i quali era stato sviluppato pip-accel). Lo usiamo anche sui nostri server di compilazione.

Abbiamo visto circa 10 volte l’accelerazione dal passaggio da pip a pip-accel .

Penso che il pacchetto “pip-accel” debba essere una buona scelta.