Pip ile yerel bir önbellekten nasıl kurabilirim?


142

Farklı sanal ortamlarda aynı paketlerin çoğunu yüklüyorum . Bir paketi bir kez indirip sonra yerel bir önbellekten pip yükleme yapabilmemin bir yolu var mı ?

Bu, indirme bant genişliğini ve süresini azaltacaktır.


1
Pip 6.0 (2014-12-22) itibarıyla pip'in varsayılan olarak önbellekleneceğini unutmayın. Ayrıntılar için pip.pypa.io/tr/stable/reference/pip_install.html#caching adresine bakın.
Pi Delport

Sadece indirme bant genişliği süresini azaltmakla kalmaz, aynı zamanda paketlerin mevcut sürümlerini kontrol etmek için PyPI endeksini taramak için harcanan zamanı da ortadan kaldırabilir ve tekerlekleri önbelleğe alırsanız, bunları sağlamayan paketler için tekerlek oluşturmak için harcanan zamanı ortadan kaldırabilir . Çok önemli bir hız artışı sağlar.
Jonathan Hartley

Yanıtlar:


125

Güncel Cevap 19-Kasım-15

Göre Pip belgelerinde :

V6.0 ile başlayarak, pip, bir web tarayıcısınınkine benzer şekilde çalışan bir varsayılan önbellek sağlar. Önbellek varsayılan olarak açıkken ve varsayılan olarak doğru olanı yapmak üzere tasarlanmış olsa da, önbelleği devre dışı bırakabilir ve --no-cache-dirseçeneği kullanarak her zaman PyPI'ye erişebilirsiniz .

Bu nedenle, bir güncelleme önbelleği istiyorsanız, güncellenmiş cevap sadece varsayılanlarıyla pip kullanmaktır.

Orijinal Yanıt

Gönderen pip haberleri , sürüm 0.1.4:

Paket indirmelerini önbelleğe alacak olan $ PIP_DOWNLOAD_CACHE çevresel değişkeni için destek eklendi, böylece gelecekteki kurulumlar büyük indirmeler gerektirmeyecek. Ağ erişimi hala gereklidir, ancak bunu kullanırken sadece bazı indirmelerden kaçınılacaktır.

Bundan yararlanmak için aşağıdakileri ekledim ~/.bash_profile:

export PIP_DOWNLOAD_CACHE=$HOME/.pip_download_cache

veya Mac kullanıyorsanız:

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

notlar

  1. Bir paketin daha yeni bir sürümü algılanırsa, paket indirilir ve PIP_DOWNLOAD_CACHEdizine eklenir . Örneğin, şimdi birkaç Django paketim var.
  2. Bu, pip haberlerinde belirtildiği gibi ağ erişimi ihtiyacını ortadan kaldırmaz , bu yüzden virtualenvsuçakta yeni oluşturmanın cevabı değil , ama yine de harika.

4
Belki daha iyi bir fikir .bashrc'ye koymaktır, çünkü bash_profile sadece giriş sırasında yürütülür. Bu size bağlı ve her neyse iyi bir tavsiye :)
Nikita Hismatov

1
Mac'lerde herhangi bir kabuğun başında yüklenir.
saul.shanabrook

3
PIP_DOWNLOAD_CACHE ciddi şekilde kusurlu ve dağıtım makinelerinize paket almak gibi şeyler için kullanmanızı tavsiye etmem. Yine de pypi.python.org'un ulaşılabilir olmasına güveniyor. Yerel bir geliştirme önbelleği için harika, ancak daha ağır kullanımlar için uygun değildir.
slacy

1
@slacy Neden ciddi şekilde kusurlu olduğu hakkında yorum yapabilir misiniz? PyPI'nin ulaşılabilir olmasını istemiyorsanız, --no-index bunun içindir; bir indirme önbelleği kesinlikle PyPI'ye ulaşmak için dik veya değil!
lvh

@lvh slacy'nin aşağıdaki cevabı Pip'in indirme önbelleğinin neden hatalı olduğunu açıklıyor. Ayrıca, önbellek etkinken pip kurulumunun daha uzun sürdüğünü gördüm, tuhaf. pip-accel ve basket daha iyi seçenekler gibi görünüyor.
qris

52

Bence pip2pibu sorun için çok daha zarif ve güvenilir bir çözüm.

Dokümanlardan:

pip2pi, pip gereksinimlerinden PyPI uyumlu bir paket deposu oluşturur

pip2pi iki basit komut kullanarak kendi PyPI dizininizi oluşturmanıza olanak tanır:

  1. Bir paketi ve tüm gereksinimlerini yansıtmak için şunu kullanın 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. Önceki dizinden bir paket dizini oluşturmak için:

    $ 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. 2. adımda oluşturduğunuz dizinden yüklemek için şunları kullanabilirsiniz:

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

Kendi indeksinizi ile uzak bir ana bilgisayara bile yansıtabilirsiniz pip2pi.


+1 pip2pip harika çalışıyor !! Ağ bağlantısına güvenmekten pek hoşlanmıyorum. En çok ihtiyacınız olduğunda başarısız olur.
MGP

bu harika çalışıyor, soruma cevap veriyor stackoverflow.com/questions/18052217/… , orada da cevap verebilir miyim?
Larry Cai

1
Belki de ima edildi, ancak açıkça belirtmeye değer: pip2tgzpaketi önceden belirlenmiş dizine indirip indirmediğinizi algılar, bu nedenle aynı yükleme satırını veya çakışan bağımlılıkları olan birkaç yükleme satırını çalıştırırsanız, her paketi yalnızca bir kez indirir.
Mart'ta clacke

32

Daha yeni Pip sürümleri için:

Yeni Pip sürümleri artık indirmeleri varsayılan olarak önbelleğe alıyor. Bu belgelere bakın:

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

Daha eski Pip sürümleri için:

Adlı bir yapılandırma dosyası oluşturun ~/.pip/pip.confve aşağıdaki içerikleri ekleyin:

[global]
download_cache = ~/.cache/pip

OS X'te, daha iyi bir seçim yolu, ~/Library/Caches/pipdiğer OS X programlarının kullandığı kurala uyduğu için olacaktır.


Ve bunları aynı bilgisayarın diğer kullanıcılarının erişebilmesi için küresel olarak depolamak istersem? Bunu nasıl yaparım? Ben yapılandırma dosyasının / etc veya başka bir yere yerleştirilmesi gerektiğini düşündüm .
Batandwa

@batandwa: Bu işe yarayabilir. Değilse, bunu deneyebilirsiniz: tüm kullanıcıların, sistem genelinde aynı dizine işaret pip.confeden bir download_cacheayara sahip olduğundan emin olun .
Flimm

28

PIP_DOWNLOAD_CACHE'ın bazı ciddi sorunları var. En önemlisi, indirmenin ana bilgisayar adını önbelleğe kodlar, böylece aynaları kullanmak imkansız hale gelir.

Pip indirmelerinin önbelleğini yönetmenin en iyi yolu, "paketi indir" adımını "paketi yükle" adımından ayırmaktır. İndirilen dosyalar genellikle "sdist dosyaları" (kaynak dağıtımları) olarak adlandırılır ve ben bunları $ SDIST_CACHE dizininde saklayacağım.

İki adım şu şekildedir:

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

Hangi paketi indirir ve $ SDIST_CACHE ile gösterilen dizine yerleştirir. Paketi yüklemez. Ve sonra koşuyorsun:

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

Paketi sanal ortamınıza yüklemek için. İdeal olarak, $ SDIST_CACHE kaynak kontrolünüz altında gerçekleştirilecektir. Üretime dağıtırken, paketleri indirmeden yüklemek için yalnızca ikinci pip komutunu çalıştırırsınız.


Gabriel - İki kez indirilmiyor, ilk adımda sadece bir kez ve ikinci adımda yerel önbellekten yükleniyor. Ne görüyorsun?
slacy

İlk adımı iki kez çalıştırırsam, iki kez indirir, değil mi? En azından burada oldu. İlk adımın yürütülmeden önce bu paket için en az bir kez yürütüldüğünü bilmem gerekecek, aksi takdirde aynı dosyayı iki kez indirecektir. Çalıştırmam gerekip gerekmediğini veya daha önce indirilmiş olup olmadığını nasıl kontrol edebilirim?
Gabriel Jordão

Muhtemelen diğer cevabın önerdiği gibi pip2pi kullanmak istiyorsunuz. :)
slacy

bu bağımlılıkları da indiriyor mu?
monkut

Pip 18.1 kullanıyorum ve opsiyon - kurulum yok. Bu cevabı nasıl güncelleyeceğiniz hakkında bir fikriniz var mı?
paolof89

13

6.0 sürümünden başlayarak , pipartık kendi önbelleğe alma özelliği var:

  • DEPRECATION pip install --download-cache ve pip wheel --download-cachekomut satırı bayrakları kullanımdan kaldırıldı ve işlevler kaldırıldı. Pip artık otomatik olarak yapılandırıldığı ve kullandığı dahili HTTP önbelleğini kullandığından --download-cachemevcut seçenekler işlevsel değildir, ancak pip v8.0'da kaldırılıncaya kadar kabul edilecektir. Daha fazla bilgi için lütfen https://pip.pypa.io/en/latest/reference/pip_install.html#caching adresine bakın.

Yukarıdaki bağlantıdan daha fazla bilgi :

V6.0 ile başlayarak, pip, bir web tarayıcısınınkine benzer şekilde çalışan bir varsayılan önbellek sağlar. Önbellek varsayılan olarak açıkken ve varsayılan olarak doğru olanı yapmak üzere tasarlanmış olsa da, önbelleği devre dışı bırakabilir ve --no-cache-dirseçeneği kullanarak her zaman PyPI'ye erişebilirsiniz .


9

pip wheel , paketleri önceden derlemenin ekstra özelliği ile istediğinizi yapan mükemmel bir seçenektir. Gönderen resmi dokümanlar :

Bir gereksinim (ve tüm bağımlılıkları) için tekerlekler oluşturun:

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

Artık /tmp/wheelhousedizininizde tüm bağımlılıklar önceden derlenmiştir, böylece klasörü başka bir sunucuya kopyalayabilir ve her şeyi bu komutla yükleyebilirsiniz:

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

Tüm paketlerin makineler arasında tamamen taşınabilir olmayacağını unutmayın. Bazı paketler, kullandığınız Python sürümü, işletim sistemi dağıtımı ve / veya donanım mimarisi için özel olarak oluşturulacaktır. Bu, -cp27-none-linux_x86_6464 bit Linux'taki CPython 2.7 gibi dosya adında belirtilecektir .


3

Sadece pip kullanarak (benim sürüm 1.2.1), ayrıca böyle bir yerel depo oluşturabilirsiniz:

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

Pip'in ilk çağrısında, gereksinimler dosyasındaki paketler yerel depoda (yalnızca) aranır ve daha sonra oradan yüklenir. Bu başarısız olursa, pip paketleri her zamanki konumundan alır (örneğin, PyPI) ve bunu indirir PIP_SDIST_INDEX(ancak hiçbir şey yüklemez!). Paketi yerel dizinden düzgün bir şekilde yüklemek için ilk çağrı "tekrarlanır".

( --download-cachetam (çıkış karakterli) URL olan yerel bir dosya adı oluşturur ve pip bunu --find-links. ile bir dizin olarak --download-cachekullanamaz. bulunursa önbelleğe alınan dosyayı kullanır. Bu seçeneği ikinci pip çağrısına ekleyebiliriz, ancak dizinden beri zaten bir tür önbellek işlevi görür, mutlaka çok fazla getirmez. Örneğin, dizininiz boşaltılırsa yardımcı olur.)


3

Bunun için pip-accel adı verilen yeni bir çözüm var, pipdahili önbellekleme için bir yedek .

Pip-accel programı, Python paket yöneticisi olan pip için bir paketleyicidir. Bir veya daha fazla gereksinim dosyası verilen Python sanal ortamlarını başlatmak için pip kullanımını hızlandırır. Bunu aşağıdaki iki yaklaşımı birleştirerek yapar:

  • Kaynak dağıtım indirmeleri önbelleğe alınır ve yerel kaynak dağıtım arşivleri dizini oluşturmak için kullanılır.

  • İkili dağıtımlar, ikili bileşenlerle (M2Crypto ve LXML gibi) bağımlılıkları yükleme işlemini hızlandırmak için kullanılır. Bu bağımlılıkları her sanal ortam için yeniden derlemek yerine, bir kez derleriz ve sonucu ikili * .tar.gz dağıtımı olarak önbelleğe alırız.

Paylogic, sürekli olarak birim testleri yürüten sürekli entegrasyon köleleri çiftliğinde sanal ortamları hızlı ve güvenilir bir şekilde başlatmak için pip-accel kullanır (bu, pip-hızının geliştirildiği orijinal kullanım durumlarından biriydi). Ayrıca yapı sunucularımızda da kullanıyoruz.

Biz geçiş dan 10x speedup etrafında gördüğüm pipiçin pip-accel.


2

Daha basit bir seçenek basket.

Bir paket adı verildiğinde, onu ve merkezi bir konuma tüm bağımlılıkları indirir; pip önbelleğinin herhangi bir dezavantajı olmadan. Bu çevrimdışı kullanım için harika.

Daha sonra bu dizini aşağıdakiler için kaynak olarak kullanabilirsiniz pip:

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

Veya easy_install:

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

Ayrıca, çevrimiçi olduğunuzda sepeti güncellemek için de kullanabilirsiniz.


Sınırlamalar (resmi sayfadan): Sepet yalnızca kaynak dağıtımlarını indirir, PyPI'de barındırılmayan paketleri indiremez ve her zaman en son sürümü indirerek sürüm gereksinimlerini (örn. "Burun> = 1.1.2") yok sayar.
hdiogenes

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.