Jak zainstalować z lokalnej pamięci podręcznej za pomocą pip?

142

Instaluję wiele takich samych pakietów w różnych środowiskach virtualenv . Czy istnieje sposób, żebym mógł raz pobrać pakiet, a następnie zainstalować pip z lokalnej pamięci podręcznej?

Zmniejszyłoby to przepustowość i czas pobierania.

Matthew Rankin
źródło
1
Zauważ, że od pip 6.0 (2014-12-22) pip będzie domyślnie buforować. Szczegółowe informacje można znaleźć w pip.pypa.io/en/stable/reference/pip_install.html#caching .
Pi Delport
To nie tylko skraca czas pobierania, ale może również wyeliminować czas spędzony na indeksowaniu indeksu PyPI w celu sprawdzenia dostępnych wersji pakietów, a jeśli buforujesz koła, może wyeliminować czas spędzony na tworzeniu kół dla pakietów, które ich nie zapewniają . Daje to bardzo znaczący wzrost prędkości.
Jonathan Hartley,

Odpowiedzi:

125

Zaktualizowana odpowiedź 19 listopada 15

Zgodnie z dokumentacją Pip :

Począwszy od wersji 6.0, pip zapewnia domyślnie włączoną pamięć podręczną, która działa podobnie do przeglądarki internetowej. Chociaż pamięć podręczna jest domyślnie włączona i została zaprojektowana, aby robić to, co należy, domyślnie możesz ją wyłączyć i zawsze uzyskiwać dostęp do PyPI, korzystając z tej --no-cache-diropcji.

Dlatego zaktualizowaną odpowiedzią jest użycie pip z domyślnymi ustawieniami, jeśli chcesz mieć pamięć podręczną pobierania.

Oryginalna odpowiedź

Z wiadomości pip , wersja 0.1.4:

Dodano obsługę zmiennej środowiskowej $ PIP_DOWNLOAD_CACHE, która będzie buforować pobieranie pakietów, więc przyszłe instalacje nie będą wymagały dużych pobrań. Dostęp do sieci jest nadal wymagany, ale podczas korzystania z niego można uniknąć tylko niektórych pobrań.

Aby to wykorzystać, dodałem do mojego ~/.bash_profile:

export PIP_DOWNLOAD_CACHE=$HOME/.pip_download_cache

lub, jeśli korzystasz z komputera Mac:

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

Uwagi

  1. Jeśli zostanie wykryta nowsza wersja pakietu, zostanie on pobrany i dodany do PIP_DOWNLOAD_CACHEkatalogu. Na przykład mam teraz sporo pakietów Django.
  2. Nie eliminuje to potrzeby dostępu do sieci, jak stwierdzono w wiadomościach pip , więc nie jest to odpowiedź na tworzenie nowych virtualenvsw samolocie, ale nadal jest świetne.
Matthew Rankin
źródło
4
Może lepszym pomysłem jest umieszczenie go w .bashrc, ponieważ bash_profile jest wykonywany tylko podczas logowania. To zależy od Ciebie, a zresztą to dobra rada :)
Nikita Hismatov
1
Na komputerach Mac jest ładowany na początku dowolnej powłoki.
saul.shanabrook
3
PIP_DOWNLOAD_CACHE jest poważnie wadliwy i nie polecałbym go używać do takich rzeczy, jak pobieranie pakietów na maszyny wdrożeniowe. Nadal opiera się również na osiągalności pypi.python.org. Doskonały do ​​lokalnej pamięci podręcznej, ale nie nadaje się do cięższych zastosowań.
slacy
1
@slacy Czy możesz skomentować, dlaczego jest to poważna wada? Jeśli nie chcesz, aby PyPI było osiągalne, do tego służy opcja --no-index; pamięć podręczna pobierania jest z pewnością ortogonalna do osiągnięcia PyPI, czy nie!
lvh
Odpowiedź @lvh slacy poniżej wyjaśnia, dlaczego pamięć podręczna pobierania Pipa jest wadliwa. Widziałem też, co dziwne, instalacja pip trwa dłużej z włączoną pamięcią podręczną. pip-accel i basket wydają się być lepszymi opcjami.
qris
52

Moim zdaniem pip2pijest dużo bardziej eleganckim i niezawodnym rozwiązaniem tego problemu.

Z dokumentów:

pip2pi buduje repozytorium pakietów zgodne z PyPI na podstawie wymagań pip

pip2pi umożliwia stworzenie własnego indeksu PyPI za pomocą dwóch prostych poleceń:

  1. Aby odzwierciedlić pakiet i wszystkie jego wymagania, użyj 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. Aby zbudować indeks pakietu z poprzedniego katalogu:

    $ 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. Aby zainstalować z indeksu utworzonego w kroku 2, możesz po prostu użyć:

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

Możesz nawet utworzyć kopię lustrzaną swojego własnego indeksu na zdalnym hoście za pomocą pip2pi.

KZ
źródło
+1 pip2pip działa świetnie !! Nie lubię tak bardzo polegać na łączności sieciowej. Zawodzi, gdy najbardziej tego potrzebujesz.
MGP
to działa świetnie, odpowiada na moje pytanie stackoverflow.com/questions/18052217/… , czy możesz tam również odpowiedzieć?
Larry Cai,
1
Może było to dorozumiane, ale warto o tym wyraźnie wspomnieć: pip2tgzwykrywa, czy już pobrałeś pakiet do wyznaczonego katalogu, więc jeśli uruchomisz tę samą linię instalacyjną lub kilka linii instalacyjnych, które mają nakładające się zależności, pobierze każdy pakiet tylko raz.
clacke
32

W przypadku nowszych wersji Pip:

Nowsze wersje Pipa teraz domyślnie buforują pobieranie. Zobacz tę dokumentację:

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

W przypadku starszych wersji Pip:

Utwórz plik konfiguracyjny o nazwie ~/.pip/pip.confi dodaj następującą zawartość:

[global]
download_cache = ~/.cache/pip

W systemie OS X lepszą ścieżką do wyboru byłoby to, że jest ~/Library/Caches/pipona zgodna z konwencją używaną przez inne programy OS X.

Flimm
źródło
A gdybym chciał przechowywać je globalnie, aby inni użytkownicy tego samego komputera mieli do nich dostęp? Jak miałbym to zrobić? Wydaje mi się, że plik konfiguracyjny musiałby być umieszczony w / etc czy coś.
Batandwa,
@batandwa: To może zadziałać. Jeśli nie, można spróbować to: upewnij się, że wszyscy użytkownicy mają pip.confz download_cacheustawieniem, że punkty do tego samego katalogu całego systemu.
Flimm,
28

PIP_DOWNLOAD_CACHE ma poważne problemy. Co najważniejsze, koduje nazwę hosta pobierania do pamięci podręcznej, więc korzystanie z serwerów lustrzanych staje się niemożliwe.

Lepszym sposobem zarządzania pamięcią podręczną pobranych plików pip jest oddzielenie kroku „pobierz pakiet” od kroku „zainstaluj pakiet”. Pobrane pliki są powszechnie nazywane „plikami sdist” (dystrybucje źródłowe) i mam zamiar przechowywać je w katalogu $ SDIST_CACHE.

Kończy się to dwoma krokami:

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

Co spowoduje pobranie pakietu i umieszczenie go w katalogu wskazywanym przez $ SDIST_CACHE. Nie zainstaluje pakietu. A potem biegniesz:

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

Aby zainstalować pakiet w środowisku wirtualnym. Idealnie byłoby, gdyby $ SDIST_CACHE zostałoby zatwierdzone pod kontrolą źródła. Podczas wdrażania w środowisku produkcyjnym należy uruchomić tylko drugie polecenie pip, aby zainstalować pakiety bez ich pobierania.

slacy
źródło
Gabriel - nie jest pobierany dwukrotnie, tylko raz w pierwszym kroku, a następnie instalowany z lokalnej pamięci podręcznej w drugim. Co widzisz?
slacy
Jeśli dwukrotnie uruchomię pierwszy krok, dwukrotnie go ściągnę, prawda? Przynajmniej stało się to tutaj. Muszę wiedzieć, że pierwszy krok dla tego pakietu został wykonany przynajmniej raz przed jego wykonaniem, w przeciwnym razie ten sam plik zostanie pobrany dwukrotnie. Jak mogę sprawdzić, czy muszę go wykonać, czy został już pobrany?
Gabriel Jordão
Prawdopodobnie chcesz po prostu użyć pip2pi, jak sugeruje druga odpowiedź. :)
slacy
czy to również pobiera zależności?
monkut
Używam pip 18.1, a opcja --no-install nie jest obecna. Masz jakiś pomysł, jak zaktualizować tę odpowiedź?
paolof89
13

Począwszy od wersji 6.0 , pipteraz ma własne buforowanie:

  • DEPRECATION pip install --download-cache i pip wheel --download-cacheflagi wiersza poleceń zostały wycofane, a funkcje usunięte. Ponieważ pip teraz automatycznie konfiguruje i używa swojej wewnętrznej pamięci podręcznej HTTP, która zastępuje --download-cacheistniejące opcje, przestała działać, ale będzie nadal akceptowana do czasu ich usunięcia w pip v8.0. Więcej informacji można znaleźć pod adresem https://pip.pypa.io/en/latest/reference/pip_install.html#caching

Więcej informacji z powyższego linku :

Począwszy od wersji 6.0, pip zapewnia domyślnie włączoną pamięć podręczną, która działa podobnie do przeglądarki internetowej. Chociaż pamięć podręczna jest domyślnie włączona i została zaprojektowana, aby robić to, co należy, domyślnie możesz ją wyłączyć i zawsze uzyskiwać dostęp do PyPI, korzystając z tej --no-cache-diropcji.

Jace Browning
źródło
9

Pip Wheel to doskonała opcja, która robi to, co chcesz, z dodatkową funkcją wstępnej kompilacji pakietów. Z oficjalnych dokumentów :

Zbuduj koła dla wymagania (i wszystkich jego zależności):

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

Teraz twój /tmp/wheelhousekatalog ma prekompilowane wszystkie zależności, więc możesz skopiować folder na inny serwer i zainstalować wszystko za pomocą tego polecenia:

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

Zwróć uwagę, że nie wszystkie pakiety będą w pełni przenośne między maszynami. Niektóre pakiety zostaną zbudowane specjalnie dla używanej wersji Pythona, dystrybucji systemu operacyjnego i / lub architektury sprzętowej. Będzie to określone w nazwie pliku, jak w -cp27-none-linux_x86_64przypadku CPython 2.7 w 64-bitowym systemie Linux itp.

hdiogenes
źródło
3

Używając tylko pip (moja wersja to 1.2.1), możesz również zbudować lokalne repozytorium w następujący sposób:

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

W pierwszym wywołaniu pip pakiety z pliku wymagań są wyszukiwane w lokalnym repozytorium (tylko), a następnie instalowane z niego. Jeśli to się nie powiedzie, pip pobiera pakiety ze swojej zwykłej lokalizacji (np. PyPI) i pobiera je do PIP_SDIST_INDEX(ale niczego nie instaluje!). Pierwsze wywołanie jest „powtarzane”, aby poprawnie zainstalować pakiet z lokalnego indeksu.

( --download-cachetworzy lokalną nazwę pliku, która jest pełnym adresem URL ze znakami ucieczki, a pip nie może użyć tego jako indeksu z --find-links. --download-cacheużyje pliku z pamięci podręcznej, jeśli zostanie znaleziony. Moglibyśmy dodać tę opcję do drugiego wywołania pip, ale ponieważ indeks już działa jako rodzaj pamięci podręcznej, niekoniecznie musi dużo przynosić. Pomogłoby na przykład opróżnienie indeksu).

user1010997
źródło
3

Pojawiło się nowe rozwiązanie tego problemu, zwane pip-accel , zamiennik typu drop-in pipz wbudowanym buforowaniem.

Program pip-accel jest opakowaniem dla pip, menedżera pakietów Pythona. Przyspiesza użycie pip do zainicjowania środowisk wirtualnych Pythona, biorąc pod uwagę jeden lub więcej plików wymagań. Czyni to poprzez połączenie następujących dwóch podejść:

  • Pliki do pobrania dystrybucji źródłowej są buforowane i używane do generowania lokalnego indeksu archiwów dystrybucji źródłowej.

  • Dystrybucje binarne służą do przyspieszenia procesu instalowania zależności z komponentami binarnymi (takimi jak M2Crypto i LXML). Zamiast ponownie kompilować te zależności dla każdego środowiska wirtualnego, kompilujemy je raz i buforujemy wynik w postaci binarnej dystrybucji * .tar.gz.

Paylogic używa pip-accel do szybkiego i niezawodnego inicjowania środowisk wirtualnych na swojej farmie niewolników ciągłej integracji, które stale przeprowadzają testy jednostkowe (był to jeden z oryginalnych przypadków użycia, dla których opracowano pip-accel). Używamy go również na naszych serwerach kompilacji.

Widzieliśmy około 10-krotne przyspieszenie przejścia z pipna pip-accel.

qris
źródło
2

Prostszą opcją jest basket.

Z podaną nazwą pakietu, pobierze go i wszystkie zależności do centralnej lokalizacji; bez żadnych wad pamięci podręcznej pip. To jest świetne do użytku w trybie offline.

Możesz następnie użyć tego katalogu jako źródła dla pip:

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

Lub easy_install:

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

Możesz również użyć go do aktualizacji koszyka, gdy jesteś online.

Burhan Khalid
źródło
Ograniczenia (z oficjalnej strony): Koszyk pobiera tylko dystrybucje źródłowe, nie może pobierać pakietów, które nie są hostowane na PyPI i ignoruje wymagania dotyczące wersji (np. "Nos> = 1.1.2"), zawsze pobierając najnowszą wersję.
hdiogenes
0

Myślę, że pakiet „pip-accel” musi być dobrym wyborem.

ostatni człowiek
źródło