Bagaimana cara saya menginstal dari cache lokal dengan pip?

142

Saya menginstal banyak paket yang sama di lingkungan virtualenv yang berbeda . Apakah ada cara saya bisa mengunduh paket sekali dan kemudian menginstal pip dari cache lokal?

Ini akan mengurangi bandwidth dan waktu pengunduhan.

Matthew Rankin
sumber
1
Perhatikan bahwa pada pip 6.0 (2014-12-22), pip akan melakukan cache secara default. Lihat pip.pypa.io/en/stable/reference/pip_install.html#caching untuk detailnya.
Pi Delport
Ini tidak hanya mengurangi waktu bandwidth unduhan, tetapi juga dapat menghilangkan waktu yang dihabiskan untuk merayapi indeks PyPI untuk memeriksa versi paket yang tersedia, dan jika Anda caching roda, itu bisa menghilangkan waktu yang dihabiskan untuk membuat roda untuk paket yang tidak menyediakannya . Ini menambah dorongan kecepatan yang sangat besar.
Jonathan Hartley

Jawaban:

125

Jawaban Diperbarui 19-Nov-15

Menurut dokumentasi Pip :

Dimulai dengan v6.0, pip menyediakan aktif dengan cache default yang fungsinya mirip dengan browser web. Saat cache diaktifkan secara default dan dirancang untuk melakukan hal yang benar secara default, Anda dapat menonaktifkan cache dan selalu mengakses PyPI dengan memanfaatkan --no-cache-diropsi.

Oleh karena itu, jawaban yang diperbarui adalah dengan hanya menggunakan pip dengan standarnya jika Anda ingin cache unduhan.

Jawaban Asli

Dari berita terbaru , versi 0.1.4:

Menambahkan dukungan untuk variabel lingkungan $ PIP_DOWNLOAD_CACHE yang akan men-cache unduhan paket, sehingga instalasi di masa mendatang tidak memerlukan unduhan besar. Akses jaringan masih diperlukan, tetapi hanya beberapa unduhan akan dihindari saat menggunakan ini.

Untuk memanfaatkan ini, saya telah menambahkan yang berikut ke ~/.bash_profile:

export PIP_DOWNLOAD_CACHE=$HOME/.pip_download_cache

atau, jika Anda menggunakan Mac:

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

Catatan

  1. Jika versi lebih baru dari sebuah paket terdeteksi, itu akan diunduh dan ditambahkan ke PIP_DOWNLOAD_CACHEdirektori. Sebagai contoh, saya sekarang memiliki beberapa paket Django.
  2. Ini tidak menghilangkan kebutuhan untuk akses jaringan, seperti yang dinyatakan dalam berita terbaru , jadi itu bukan jawaban untuk membuat yang baru virtualenvsdi pesawat, tetapi masih bagus.
Matthew Rankin
sumber
4
Mungkin ide yang lebih baik adalah memasukkannya ke .bashrc, karena bash_profile dijalankan hanya saat login. Terserah Anda, dan lagi pula itu saran yang bagus :)
Nikita Hismatov
1
Pada mac, ia dimuat di awal setiap shell.
saul.shanabrook
3
PIP_DOWNLOAD_CACHE cacat serius dan saya tidak akan merekomendasikan menggunakannya untuk hal-hal seperti mengeluarkan paket ke mesin penyebaran Anda. Itu juga masih bergantung pada pypi.python.org yang bisa dijangkau. Bagus untuk cache pengembangan lokal, tetapi tidak cocok untuk penggunaan yang lebih berat.
slacy
1
@slacy Bisakah Anda mengomentari mengapa itu cacat serius? Jika Anda tidak ingin PyPI dapat dijangkau, itulah - - tidak ada indeks untuk; cache unduhan tentu ortogonal untuk mencapai PyPI atau tidak!
lvh
Jawaban slv @ lvh di bawah ini menjelaskan mengapa cache unduhan Pip cacat. Saya juga melihat pemasangan pip membutuhkan waktu lebih lama dengan cache diaktifkan, aneh. pip-accel dan keranjang tampaknya merupakan opsi yang lebih baik.
qris
52

Menurut pendapat saya, pip2piadalah solusi yang jauh lebih elegan dan dapat diandalkan untuk masalah ini.

Dari dokumen:

pip2pi membangun repositori paket yang kompatibel dengan PyPI dari persyaratan pip

pip2pi memungkinkan Anda untuk membuat indeks PyPI Anda sendiri dengan menggunakan dua perintah sederhana:

  1. Untuk mencerminkan paket dan semua persyaratannya, gunakan 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. Untuk membangun indeks paket dari direktori sebelumnya:

    $ 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. Untuk menginstal dari indeks yang Anda buat pada langkah 2., Anda cukup menggunakan:

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

Anda bahkan dapat mencerminkan indeks Anda sendiri ke host jarak jauh dengan pip2pi.

KZ
sumber
+1 pip2pip berfungsi dengan baik !! Saya tidak suka mengandalkan konektivitas jaringan sebanyak itu. Gagal saat Anda paling membutuhkannya.
MGP
ini berfungsi dengan baik, ia menjawab pertanyaan saya stackoverflow.com/questions/18052217/... , dapatkah Anda menjawab di sana juga?
Larry Cai
1
Mungkin itu tersirat, tetapi perlu disebutkan secara eksplisit: pip2tgzmendeteksi jika Anda telah mengunduh paket ke direktori yang ditunjuk, jadi jika Anda menjalankan jalur instal yang sama atau beberapa jalur instal yang memiliki dependensi yang tumpang tindih, ia hanya akan mengunduh setiap paket sekali saja.
clacke
32

Untuk versi Pip yang lebih baru:

Versi Pip yang lebih baru sekarang mengunduh cache secara default. Lihat dokumentasi ini:

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

Untuk versi Pip yang lebih lama:

Buat file konfigurasi dengan nama ~/.pip/pip.conf, dan tambahkan konten berikut:

[global]
download_cache = ~/.cache/pip

Pada OS X, jalur yang lebih baik untuk dipilih adalah ~/Library/Caches/pipkarena mengikuti konvensi yang digunakan oleh program OS X lainnya.

Flimm
sumber
Dan Jika saya ingin menyimpannya secara global untuk diakses oleh pengguna lain dari PC yang sama? Bagaimana saya melakukannya? Saya pikir file config harus ditempatkan di / etc atau sesuatu.
Batandwa
@ Batandwa: Itu mungkin berhasil. Jika tidak, Anda dapat mencoba ini: pastikan bahwa semua pengguna memiliki pip.confdengan download_cachepengaturan yang mengarah ke direktori seluruh sistem yang sama.
Flimm
28

PIP_DOWNLOAD_CACHE memiliki beberapa masalah serius. Yang paling penting, ini mengkodekan hostname dari unduhan ke dalam cache, jadi menggunakan mirror menjadi tidak mungkin.

Cara yang lebih baik untuk mengelola cache unduhan pip adalah dengan memisahkan langkah "unduh paket" dari langkah "instal paket". File yang diunduh biasanya disebut "file sdist" (distribusi sumber) dan saya akan menyimpannya dalam direktori $ SDIST_CACHE.

Dua langkah tersebut akhirnya menjadi:

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

Yang akan mengunduh paket dan meletakkannya di direktori yang ditunjuk oleh $ SDIST_CACHE. Itu tidak akan menginstal paket. Dan kemudian Anda menjalankan:

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

Untuk menginstal paket ke lingkungan virtual Anda. Idealnya, $ SDIST_CACHE akan dilakukan di bawah kendali sumber Anda. Saat menggunakan produksi, Anda hanya akan menjalankan perintah pip kedua untuk menginstal paket tanpa mengunduhnya.

slacy
sumber
Gabriel - Ini tidak diunduh dua kali, hanya sekali pada langkah pertama dan kemudian diinstal dari cache lokal di yang kedua. Apa yang kamu lihat?
slacy
Jika saya menjalankan langkah pertama dua kali, itu akan mengunduhnya dua kali, kan? Setidaknya itu terjadi di sini. Saya perlu tahu bahwa langkah pertama telah dijalankan untuk paket ini setidaknya sekali sebelum menjalankannya, jika tidak maka akan mengunduh file yang sama dua kali. Bagaimana saya bisa mengecek apakah saya perlu menjalankannya atau sudah diunduh sebelumnya?
Gabriel Jordão
Anda mungkin hanya ingin menggunakan pip2pi seperti jawaban yang disarankan. :)
slacy
apakah ini juga mengunduh dependensi?
monkut
Saya menggunakan pip 18.1 dan opsi --tidak menginstal tidak ada. Ada ide tentang cara memperbarui jawaban ini?
paolof89
13

Mulai dalam versi 6.0 , pipsekarang melakukan caching sendiri:

  • DEPRECATION pip install --download-cache dan pip wheel --download-cacheflag-flag command line sudah tidak digunakan lagi dan fungsinya dihapus. Karena pip sekarang secara otomatis mengkonfigurasi dan menggunakan cache HTTP internal yang menggantikan --download-cacheopsi yang ada telah dibuat tidak berfungsi tetapi masih akan diterima sampai dihapus di pip v8.0. Untuk informasi lebih lanjut silakan lihat https://pip.pypa.io/en/latest/reference/pip_install.html#caching

Informasi lebih lanjut dari tautan di atas :

Dimulai dengan v6.0, pip menyediakan aktif dengan cache default yang fungsinya mirip dengan browser web. Saat cache diaktifkan secara default dan dirancang untuk melakukan hal yang benar secara default, Anda dapat menonaktifkan cache dan selalu mengakses PyPI dengan memanfaatkan --no-cache-diropsi.

Jace Browning
sumber
9

roda pip adalah opsi yang sangat baik yang melakukan apa yang Anda inginkan dengan fitur tambahan pra-kompilasi paket. Dari dokumen resmi :

Bangun roda untuk suatu persyaratan (dan semua dependensinya):

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

Sekarang /tmp/wheelhousedirektori Anda memiliki semua dependensi yang telah dikompilasi, sehingga Anda dapat menyalin folder ke server lain dan menginstal semuanya dengan perintah ini:

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

Perhatikan bahwa tidak semua paket akan sepenuhnya portabel di seluruh mesin. Beberapa paket akan dibuat khusus untuk versi Python, distribusi OS dan / atau arsitektur perangkat keras yang Anda gunakan. Itu akan ditentukan dalam nama file, seperti -cp27-none-linux_x86_64untuk CPython 2.7 pada Linux 64-bit, dll.

hdiogenes
sumber
3

Hanya menggunakan pip (versi saya 1.2.1), Anda juga dapat membangun repositori lokal seperti ini:

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

Dalam panggilan pertama pip, paket-paket dari file persyaratan dilihat dalam repositori lokal (hanya), dan kemudian diinstal dari sana. Jika gagal, pip mengambil paket dari lokasi biasanya (mis. PyPI) dan mengunduhnya ke PIP_SDIST_INDEX(tetapi tidak menginstal apa pun!). Panggilan pertama "diulang" untuk menginstal paket dengan benar dari indeks lokal.

( --download-cachemembuat nama file lokal yang merupakan URL lengkap (lolos), dan pip tidak dapat menggunakan ini sebagai indeks dengan --find-links. --download-cacheakan menggunakan file yang di-cache, jika ditemukan. Kami dapat menambahkan opsi ini ke panggilan kedua pip, tetapi karena indeks sudah berfungsi sebagai semacam cache, itu tidak selalu membawa banyak. Ini akan membantu jika indeks Anda dikosongkan, misalnya.)

pengguna1010997
sumber
3

Ada solusi baru untuk pip-accel ini , pengganti drop-in untuk pipcaching bawaan.

Program pip-accel adalah pembungkus untuk pip, manajer paket Python. Ini mempercepat penggunaan pip untuk menginisialisasi lingkungan virtual Python diberikan satu atau lebih file persyaratan. Ia melakukannya dengan menggabungkan dua pendekatan berikut:

  • Unduhan distribusi sumber di-cache dan digunakan untuk menghasilkan indeks lokal arsip distribusi sumber.

  • Distribusi biner digunakan untuk mempercepat proses pemasangan dependensi dengan komponen biner (seperti M2Crypto dan LXML). Alih-alih mengkompilasi ulang dependensi ini untuk setiap lingkungan virtual, kami mengkompilasinya sekali dan menyimpan hasilnya sebagai distribusi biner * .tar.gz.

Paylogic menggunakan pip-accel untuk secara cepat dan andal menginisialisasi lingkungan virtual di ladangnya budak integrasi berkelanjutan yang secara konstan menjalankan tes unit (ini adalah salah satu kasus penggunaan asli yang membuat pip-accel dikembangkan). Kami juga menggunakannya di server build kami.

Kami telah melihat sekitar 10x percepatan dari beralih dari pipke pip-accel.

qris
sumber
2

Opsi yang lebih sederhana adalah basket.

Diberi nama paket, itu akan mengunduhnya dan semua dependensi ke lokasi pusat; tanpa kekurangan cache pip. Ini bagus untuk penggunaan offline.

Anda kemudian dapat menggunakan direktori ini sebagai sumber untuk pip:

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

Atau easy_install:

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

Anda juga dapat menggunakannya untuk memperbarui keranjang kapan pun Anda online.

Burhan Khalid
sumber
Keterbatasan (dari halaman resmi): Hanya distribusi sumber unduhan keranjang, keranjang tidak dapat mengunduh paket yang tidak dihosting di PyPI dan mengabaikan persyaratan versi (mis. "Nose> = 1.1.2"), selalu mengunduh versi terbaru.
hdiogenes
0

Saya pikir paket "pip-accel" harus menjadi pilihan yang baik.

manusia terakhir
sumber