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.
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.
Jawaban:
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-dir
opsi.
Oleh karena itu, jawaban yang diperbarui adalah dengan hanya menggunakan pip dengan standarnya jika Anda ingin cache unduhan.
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
PIP_DOWNLOAD_CACHE
direktori. Sebagai contoh, saya sekarang memiliki beberapa paket Django.virtualenvs
di pesawat, tetapi masih bagus.Menurut pendapat saya, pip2pi
adalah 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:
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
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
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
.
pip2tgz
mendeteksi 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.
Versi Pip yang lebih baru sekarang mengunduh cache secara default. Lihat dokumentasi ini:
https://pip.pypa.io/en/stable/reference/pip_install/#caching
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/pip
karena mengikuti konvensi yang digunakan oleh program OS X lainnya.
pip.conf
dengan download_cache
pengaturan yang mengarah ke direktori seluruh sistem yang sama.
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.
Mulai dalam versi 6.0 , pip
sekarang melakukan caching sendiri:
- DEPRECATION
pip install --download-cache
danpip wheel --download-cache
flag-flag command line sudah tidak digunakan lagi dan fungsinya dihapus. Karena pip sekarang secara otomatis mengkonfigurasi dan menggunakan cache HTTP internal yang menggantikan--download-cache
opsi 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-dir
opsi.
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/wheelhouse
direktori 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_64
untuk CPython 2.7 pada Linux 64-bit, dll.
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-cache
membuat nama file lokal yang merupakan URL lengkap (lolos), dan pip tidak dapat menggunakan ini sebagai indeks dengan --find-links
. --download-cache
akan 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.)
Ada solusi baru untuk pip-accel ini , pengganti drop-in untuk pip
caching 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 pip
ke pip-accel
.
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.
Saya pikir paket "pip-accel" harus menjadi pilihan yang baik.