Wie installiere ich mit pip aus einem lokalen Cache?

142

Ich installiere viele der gleichen Pakete in verschiedenen virtuellen Umgebungen. Gibt es eine Möglichkeit, ein Paket einmal herunterzuladen und dann pip aus einem lokalen Cache installieren zu lassen?

Dies würde die Download-Bandbreite und -Zeit reduzieren.

Matthew Rankin
quelle
1
Beachten Sie, dass ab Pip 6.0 (22.12.2014) Pip standardmäßig zwischengespeichert wird. Weitere Informationen finden Sie unter pip.pypa.io/en/stable/reference/pip_install.html#caching .
Pi Delport
Dies reduziert nicht nur die Zeit für die Download-Bandbreite, sondern auch die Zeit, die für das Crawlen des PyPI-Index zum Überprüfen verfügbarer Paketversionen aufgewendet wird. Wenn Sie Räder zwischenspeichern, kann auch die Zeit für das Erstellen von Rädern für Pakete, die diese nicht bereitstellen, entfallen . Dies führt zu einem sehr erheblichen Geschwindigkeitsschub.
Jonathan Hartley

Antworten:

125

Aktualisierte Antwort 19-Nov-15

Laut Pip-Dokumentation :

Ab Version 6.0 bietet pip einen standardmäßig aktivierten Cache, der ähnlich wie der eines Webbrowsers funktioniert. Während der Cache standardmäßig aktiviert ist und standardmäßig das Richtige tut, können Sie den Cache deaktivieren und mithilfe der --no-cache-dirOption immer auf PyPI zugreifen .

Daher besteht die aktualisierte Antwort darin, pip nur mit seinen Standardeinstellungen zu verwenden, wenn Sie einen Download-Cache wünschen.

Ursprüngliche Antwort

Aus den Pip News , Version 0.1.4:

Unterstützung für eine Umgebungsvariable $ PIP_DOWNLOAD_CACHE hinzugefügt, die Paket-Downloads zwischenspeichert, sodass zukünftige Installationen keine großen Downloads erfordern. Netzwerkzugriff ist weiterhin erforderlich, aber nur einige Downloads werden vermieden, wenn Sie dies verwenden.

Um dies zu nutzen, habe ich Folgendes zu meinem hinzugefügt ~/.bash_profile:

export PIP_DOWNLOAD_CACHE=$HOME/.pip_download_cache

oder, wenn Sie auf einem Mac sind:

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

Anmerkungen

  1. Wenn eine neuere Version eines Pakets erkannt wird, wird es heruntergeladen und dem PIP_DOWNLOAD_CACHEVerzeichnis hinzugefügt . Zum Beispiel habe ich jetzt einige Django-Pakete.
  2. Dies beseitigt nicht die Notwendigkeit eines Netzwerkzugriffs, wie in den Pip-Nachrichten angegeben . Es ist also nicht die Antwort für das Erstellen neuer virtualenvsDaten im Flugzeug, aber es ist trotzdem großartig.
Matthew Rankin
quelle
4
Vielleicht ist es besser, es in .bashrc abzulegen, da bash_profile nur während der Anmeldung ausgeführt wird. Das liegt an dir und ist trotzdem ein guter Rat :)
Nikita Hismatov
1
Auf Macs wird es am Anfang einer beliebigen Shell geladen.
saul.shanabrook
3
PIP_DOWNLOAD_CACHE ist ernsthaft fehlerhaft und ich würde nicht empfehlen, es für Dinge wie das Versenden von Paketen auf Ihre Bereitstellungscomputer zu verwenden. Es hängt auch weiterhin davon ab, dass pypi.python.org erreichbar ist. Ideal für einen lokalen Entwicklungscache, aber nicht für schwerere Anwendungen geeignet.
Slacy
1
@slacy Könnten Sie kommentieren, warum es ernsthaft fehlerhaft ist? Wenn Sie nicht möchten, dass PyPI erreichbar ist, ist --no-index dafür gedacht. Ein Download-Cache ist sicherlich orthogonal zum Erreichen von PyPI oder nicht!
lvh
Die Antwort von @lvh slacy unten erklärt, warum Pips Download-Cache fehlerhaft ist. Ich habe auch gesehen, dass die Pip-Installation bei aktiviertem Cache länger dauert, bizarrerweise. Pip-Accel und Basket scheinen bessere Optionen zu sein.
Qris
52

Meiner Meinung nach pip2piist eine viel elegantere und zuverlässigere Lösung für dieses Problem.

Aus den Dokumenten:

pip2pi erstellt aus den Pip-Anforderungen ein PyPI-kompatibles Paket-Repository

pip2pi Mit zwei einfachen Befehlen können Sie Ihren eigenen PyPI-Index erstellen:

  1. Verwenden Sie zum Spiegeln eines Pakets und aller seiner Anforderungen 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. So erstellen Sie einen Paketindex aus dem vorherigen Verzeichnis:

    $ 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. Um von dem in Schritt 2 erstellten Index zu installieren, können Sie einfach Folgendes verwenden:

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

Sie können sogar Ihren eigenen Index auf einen Remote-Host mit spiegeln pip2pi.

KZ
quelle
+1 pip2pip funktioniert super !! Ich mag es nicht so sehr, mich auf Netzwerkkonnektivität zu verlassen. Es schlägt fehl, wenn Sie es am meisten brauchen.
MGP
das funktioniert super , es beantwortet meine frage stackoverflow.com/questions/18052217/… , kannst du dort auch antworten?
Larry Cai
1
Möglicherweise wurde dies impliziert, aber es ist explizit erwähnenswert: pip2tgzErkennt, ob Sie das Paket bereits in das angegebene Verzeichnis heruntergeladen haben. Wenn Sie also dieselbe Installationszeile oder mehrere Installationszeilen mit überlappenden Abhängigkeiten ausführen, wird jedes Paket nur einmal heruntergeladen.
Clacke
32

Für neuere Pip-Versionen:

Neuere Pip-Versionen speichern Downloads jetzt standardmäßig im Cache. Siehe diese Dokumentation:

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

Für ältere Pip-Versionen:

Erstellen Sie eine Konfigurationsdatei mit dem Namen ~/.pip/pip.confund fügen Sie den folgenden Inhalt hinzu:

[global]
download_cache = ~/.cache/pip

Unter OS X wäre ein besserer Weg zu wählen, ~/Library/Caches/pipda er der Konvention folgt, die andere OS X-Programme verwenden.

Flimm
quelle
Und wenn ich sie global speichern wollte, damit andere Benutzer desselben PCs darauf zugreifen können? Wie würde ich das machen? Ich denke, die Konfigurationsdatei müsste in / etc oder so platziert werden.
Batandwa
@ Batandwa: Das könnte funktionieren. Wenn nicht, können Sie Folgendes versuchen: Stellen Sie sicher, dass alle Benutzer pip.confeine download_cacheEinstellung haben, die auf dasselbe systemweite Verzeichnis verweist.
Flimm
28

PIP_DOWNLOAD_CACHE hat einige schwerwiegende Probleme. Am wichtigsten ist, dass der Hostname des Downloads in den Cache codiert wird, sodass die Verwendung von Spiegeln unmöglich wird.

Die bessere Möglichkeit, einen Cache mit Pip-Downloads zu verwalten, besteht darin, den Schritt "Paket herunterladen" vom Schritt "Paket installieren" zu trennen. Die heruntergeladenen Dateien werden üblicherweise als "SDIST-Dateien" (Quelldistributionen) bezeichnet und ich werde sie in einem Verzeichnis $ SDIST_CACHE speichern.

Die zwei Schritte sind:

pip install --no-install --use-mirrors -I --download=$SDIST_CACHE <package name>

Dadurch wird das Paket heruntergeladen und in dem Verzeichnis abgelegt, auf das $ SDIST_CACHE verweist. Das Paket wird nicht installiert. Und dann rennst du:

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

So installieren Sie das Paket in Ihrer virtuellen Umgebung Im Idealfall wird $ SDIST_CACHE unter Ihrer Quellcodeverwaltung festgeschrieben. Bei der Bereitstellung in der Produktion würden Sie nur den zweiten Befehl pip ausführen, um die Pakete zu installieren, ohne sie herunterzuladen.

Slacy
quelle
Gabriel - Es wird nicht zweimal heruntergeladen, sondern nur einmal im ersten Schritt und dann im zweiten aus dem lokalen Cache installiert. Was siehst du?
Slacy
Wenn ich den ersten Schritt zweimal ausführe, wird er zweimal heruntergeladen, oder? Zumindest ist es hier passiert. Ich muss wissen, dass der erste Schritt für dieses Paket mindestens einmal ausgeführt wurde, bevor es ausgeführt wird. Andernfalls wird dieselbe Datei zweimal heruntergeladen. Wie kann ich überprüfen, ob ich es ausführen muss oder ob es zuvor heruntergeladen wurde?
Gabriel Jordão
Sie möchten wahrscheinlich nur pip2pi verwenden, wie die andere Antwort vorschlägt. :)
Slacy
Lädt dies auch die Abhängigkeiten herunter?
Mönch
Ich benutze Pip 18.1 und die Option --no-install ist nicht vorhanden. Haben Sie eine Idee, wie Sie diese Antwort aktualisieren können?
paolof89
13

Ab Version 6.0 wird pipjetzt ein eigenes Caching durchgeführt:

  • DEPRECATION- pip install --download-cache und pip wheel --download-cacheBefehlszeilenflags sind veraltet und die Funktionalität wurde entfernt. Da pip jetzt automatisch den internen HTTP-Cache konfiguriert und verwendet, der --download-cachedie vorhandenen Optionen ersetzt, wurden diese nicht mehr funktionsfähig gemacht, werden jedoch bis zu ihrer Entfernung in pip v8.0 weiterhin akzeptiert. Weitere Informationen finden Sie unter https://pip.pypa.io/en/latest/reference/pip_install.html#caching

Weitere Informationen über den obigen Link :

Ab Version 6.0 bietet pip einen standardmäßig aktivierten Cache, der ähnlich wie der eines Webbrowsers funktioniert. Während der Cache standardmäßig aktiviert ist und standardmäßig das Richtige tut, können Sie den Cache deaktivieren und mithilfe der --no-cache-dirOption immer auf PyPI zugreifen .

Jace Browning
quelle
9

Pip Wheel ist eine hervorragende Option, die mit der zusätzlichen Funktion des Vorkompilierens der Pakete das macht, was Sie wollen. Aus den offiziellen Dokumenten :

Bauen Sie Räder für eine Anforderung (und alle ihre Abhängigkeiten):

$ pip wheel --wheel-dir=/tmp/wheelhouse SomePackage

Jetzt sind in Ihrem /tmp/wheelhouseVerzeichnis alle Abhängigkeiten vorkompiliert, sodass Sie den Ordner auf einen anderen Server kopieren und alles mit diesem Befehl installieren können:

$ pip install --no-index --find-links=/tmp/wheelhouse SomePackage

Beachten Sie, dass nicht alle Pakete maschinenübergreifend vollständig portierbar sind. Einige Pakete werden speziell für die von Ihnen verwendete Python-Version, Betriebssystemverteilung und / oder Hardwarearchitektur erstellt. Dies wird im Dateinamen angegeben, wie -cp27-none-linux_x86_64bei CPython 2.7 unter 64-Bit-Linux usw.

hdiogenes
quelle
3

Wenn Sie nur pip verwenden (meine Version ist 1.2.1), können Sie auch ein lokales Repository wie folgt erstellen:

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

Beim ersten Aufruf von pip werden die Pakete aus der Anforderungsdatei (nur) im lokalen Repository nachgeschlagen und von dort aus installiert. Wenn dies fehlschlägt, ruft pip die Pakete von ihrem üblichen Speicherort (z. B. PyPI) ab und lädt sie auf das herunter PIP_SDIST_INDEX(installiert jedoch nichts!). Der erste Aufruf wird "wiederholt", um das Paket ordnungsgemäß aus dem lokalen Index zu installieren.

( --download-cacheErstellt einen lokalen Dateinamen, der die vollständige (maskierte) URL ist, und pip kann diesen nicht als Index mit verwenden --find-links. --download-cacheVerwendet die zwischengespeicherte Datei, falls gefunden. Wir könnten diese Option zum zweiten Aufruf von pip hinzufügen, jedoch seit dem Index Funktioniert bereits als eine Art Cache, bringt es nicht unbedingt viel. Es würde helfen, wenn Ihr Index zum Beispiel geleert wird.)

user1010997
quelle
3

Hierfür gibt es eine neue Lösung namens Pip-Accel , ein Drop-In-Ersatz für das integrierte pipCaching.

Das pip-accel-Programm ist ein Wrapper für pip, den Python-Paketmanager. Es beschleunigt die Verwendung von pip zum Initialisieren von virtuellen Python-Umgebungen bei einer oder mehreren Anforderungsdateien. Dazu werden die folgenden beiden Ansätze kombiniert:

  • Quelldistributions-Downloads werden zwischengespeichert und verwendet, um einen lokalen Index der Quelldistributionsarchive zu generieren.

  • Binärverteilungen werden verwendet, um die Installation von Abhängigkeiten mit Binärkomponenten (wie M2Crypto und LXML) zu beschleunigen. Anstatt diese Abhängigkeiten für jede virtuelle Umgebung erneut zu kompilieren, kompilieren wir sie einmal und speichern das Ergebnis als binäre * .tar.gz-Verteilung zwischen.

Paylogic verwendet pip-accel, um virtuelle Umgebungen in seiner Farm von Slaves mit kontinuierlicher Integration, die ständig Unit-Tests ausführen, schnell und zuverlässig zu initialisieren (dies war einer der ursprünglichen Anwendungsfälle, für die pip-accel entwickelt wurde). Wir verwenden es auch auf unseren Build-Servern.

Wir haben eine etwa 10-fache Beschleunigung beim Wechsel von pipzu gesehen pip-accel.

qris
quelle
2

Eine einfachere Option ist basket.

Wenn ein Paketname angegeben wird, werden dieser und alle Abhängigkeiten an einen zentralen Ort heruntergeladen. ohne die Nachteile des Pip-Cache. Dies ist ideal für die Offline-Verwendung.

Sie können dieses Verzeichnis dann als Quelle verwenden für pip:

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

Oder easy_install:

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

Sie können damit auch den Warenkorb aktualisieren, wenn Sie online sind.

Burhan Khalid
quelle
Einschränkungen (von der offiziellen Seite): Basket lädt nur Quelldistributionen herunter, kann keine Pakete herunterladen, die nicht auf PyPI gehostet werden, und ignoriert die Versionsanforderungen (z. B. "Nase> = 1.1.2"), wobei immer die neueste Version heruntergeladen wird.
hdiogenes
0

Ich denke, das Paket "pip-accel" muss eine gute Wahl sein.

lasthuman
quelle