Come installo da una cache locale con pip?


142

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.


1
Nota che a partire da pip 6.0 (22-12-2014), pip verrà memorizzato nella cache per impostazione predefinita. Vedere pip.pypa.io/en/stable/reference/pip_install.html#caching per i dettagli.
Pi Delport,

Non riduce solo il tempo di larghezza di banda del download, ma può anche eliminare il tempo impiegato per la scansione dell'indice PyPI per verificare le versioni disponibili dei pacchetti e, se si memorizzano nella cache ruote, è possibile eliminare il tempo impiegato per la creazione di ruote per pacchetti che non li forniscono . Aggiunge un aumento di velocità molto sostanziale.
Jonathan Hartley,

Risposte:


125

Risposta aggiornata 19-nov-15

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-diropzione.

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

Risposta originale

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

Appunti

  1. Se viene rilevata una versione più recente di un pacchetto, questo verrà scaricato e aggiunto alla PIP_DOWNLOAD_CACHEdirectory. Ad esempio, ora ho parecchi pacchetti Django.
  2. Questo non elimina la necessità di accesso alla rete, come indicato nelle notizie pip , quindi non è la risposta per la creazione di nuovi virtualenvssull'aereo, ma è comunque eccezionale.

4
Forse l'idea migliore è di metterlo in .bashrc, perché bash_profile viene eseguito solo durante il login.
Dipende

1
Sui Mac viene caricato all'inizio di qualsiasi shell.
saul.shanabrook,

3
PIP_DOWNLOAD_CACHE è gravemente difettoso e non consiglierei di usarlo per cose come portare i pacchetti sulle macchine di distribuzione. Si basa inoltre sul fatto che pypi.python.org sia raggiungibile. Ottimo per una cache di sviluppo locale, ma non adatto per usi più pesanti.
slacy,

1
@slacy Potresti commentare perché è gravemente difettoso? Se non vuoi che PyPI sia raggiungibile, ecco a cosa serve --no-index; una cache di download è sicuramente ortogonale al raggiungimento o meno di PyPI!
lvh

La seguente risposta di @lvh slacy spiega perché la cache di download di Pip è difettosa. Ho anche visto l'installazione di pip richiedere più tempo con la cache abilitata, in modo bizzarro. pip-accel e basket sembrano essere le opzioni migliori.
Qris,

52

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:

  1. 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
    
  2. 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
    
  3. 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.


+1 pip2pip funziona alla grande !! Non mi piace fare così tanto affidamento sulla connettività di rete. Fallisce quando ne hai più bisogno.
MGP,

funziona alla grande, risponde alla mia domanda stackoverflow.com/questions/18052217/… , puoi rispondere anche lì?
Larry Cai,

1
Forse era implicito, ma vale la pena menzionarlo esplicitamente: pip2tgzrileva 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.
clacke

32

Per le versioni Pip più recenti:

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

Per versioni precedenti di Pip:

Creare un file di configurazione denominato ~/.pip/pip.confe aggiungere i seguenti contenuti:

[global]
download_cache = ~/.cache/pip

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


E se volessi memorizzarli a livello globale per consentire l'accesso ad altri utenti dello stesso PC? Come potrei farlo? Immagino che il file di configurazione debba essere inserito in / etc o qualcosa del genere.
Batandwa,

@batandwa: potrebbe funzionare. In caso contrario, si potrebbe provare questo: fare in modo che tutti gli utenti hanno una pip.confcon un download_cacheambiente che punti alla stessa directory di sistema.
Flimm,

28

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.


Gabriel: non viene scaricato due volte, solo una volta nel primo passaggio e quindi installato dalla cache locale nel secondo. Cosa stai vedendo?
slacy,

Se eseguo il primo passaggio due volte, lo scaricherò due volte, giusto? Almeno è successo qui. Dovrò sapere che il primo passo è stato eseguito per questo pacchetto almeno una volta prima di eseguirlo, altrimenti scaricherà lo stesso file due volte. Come posso verificare se devo eseguirlo o se è stato scaricato prima?
Gabriel Jordão,

Probabilmente vuoi solo usare pip2pi come suggerisce l'altra risposta. :)
slacy,

questo scarica anche le dipendenze?
monkut,

Uso pip 18.1 e l'opzione --no-install non è presente. Qualche idea su come aggiornare questa risposta?
paolof89,

13

A partire dalla versione 6.0 , pipora esegue la propria memorizzazione nella cache:

  • DEPRECATION pip install --download-cache e pip wheel --download-cacheflag 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-cachele 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-diropzione.


9

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/wheelhousedirectory 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_64per CPython 2.7 su un Linux a 64 bit, ecc.


3

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-cachecrea un nome file locale che è l'URL completo (con escape) e pip non può utilizzarlo come indice con --find-links. --download-cacheutilizzerà 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.)


3

C'è una nuova soluzione a questo chiamato pip-accel , un rimpiazzo drop-in pipcon 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 pipa pip-accel.


2

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.


Limitazioni (dalla pagina ufficiale): Basket scarica solo le distribuzioni dei sorgenti, non può scaricare pacchetti che non sono ospitati su PyPI e ignora i requisiti di versione (es. "Nose> = 1.1.2"), scaricando sempre l'ultima versione.
hdiogenes,

0

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.