Tôi cài đặt rất nhiều gói giống nhau trong các môi trường virtualenv khác nhau . Có cách nào để tôi có thể tải xuống gói một lần và sau đó cài đặt pip từ bộ đệm cục bộ không?
Điều này sẽ làm giảm băng thông tải xuống và thời gian.
Tôi cài đặt rất nhiều gói giống nhau trong các môi trường virtualenv khác nhau . Có cách nào để tôi có thể tải xuống gói một lần và sau đó cài đặt pip từ bộ đệm cục bộ không?
Điều này sẽ làm giảm băng thông tải xuống và thời gian.
Câu trả lời:
Theo tài liệu của Pip :
Bắt đầu với v6.0, pip cung cấp một bộ đệm theo mặc định có chức năng tương tự như của trình duyệt web. Mặc dù bộ đệm được bật theo mặc định và được thiết kế để thực hiện đúng theo mặc định, bạn có thể tắt bộ đệm và luôn truy cập PyPI bằng cách sử dụng
--no-cache-dir
tùy chọn.
Do đó, câu trả lời được cập nhật là chỉ sử dụng pip với mặc định của nó nếu bạn muốn tải xuống bộ đệm.
Từ tin tức pip , phiên bản 0.1.4:
Đã thêm hỗ trợ cho biến môi trường $ PIP_DOWNLOAD_CACHE sẽ lưu bộ đệm tải xuống gói, vì vậy các cài đặt trong tương lai sẽ không yêu cầu tải xuống lớn. Truy cập mạng vẫn được yêu cầu, nhưng chỉ cần tránh một số tải xuống khi sử dụng.
Để tận dụng điều này, tôi đã thêm những điều sau vào ~/.bash_profile
:
export PIP_DOWNLOAD_CACHE=$HOME/.pip_download_cache
hoặc, nếu bạn đang dùng Mac:
export PIP_DOWNLOAD_CACHE=$HOME/Library/Caches/pip-downloads
PIP_DOWNLOAD_CACHE
thư mục. Ví dụ, bây giờ tôi có khá nhiều gói Django.virtualenvs
trên máy bay, nhưng nó vẫn rất tuyệt.Theo ý kiến của tôi, pip2pi
là một giải pháp thanh lịch và đáng tin cậy hơn nhiều cho vấn đề này.
Từ các tài liệu:
pip2pi xây dựng kho lưu trữ gói tương thích PyPI từ các yêu cầu của pip
pip2pi
cho phép bạn tạo chỉ mục PyPI của riêng mình bằng cách sử dụng hai lệnh đơn giản:
Để phản ánh một gói và tất cả các yêu cầu của nó, sử dụng 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
Để xây dựng một chỉ mục gói từ thư mục trước:
$ 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
Để cài đặt từ chỉ mục bạn đã tạo ở bước 2., bạn chỉ cần sử dụng:
pip install --index-url=file:///tmp/packages/simple/ httpie==0.2
Bạn thậm chí có thể phản chiếu chỉ mục của riêng bạn đến một máy chủ từ xa pip2pi
.
pip2tgz
phát hiện nếu bạn đã tải gói xuống thư mục được chỉ định, vì vậy nếu bạn chạy cùng một dòng cài đặt hoặc một vài dòng cài đặt có phụ thuộc chồng chéo, nó sẽ chỉ tải xuống mỗi gói một lần.
Các phiên bản Pip mới hơn bây giờ tải xuống bộ đệm theo mặc định. Xem tài liệu này:
https://pip.pypa.io/en/urdy/reference/pip_install/#caching
Tạo một tệp cấu hình có tên ~/.pip/pip.conf
và thêm các nội dung sau:
[global]
download_cache = ~/.cache/pip
Trên OS X, một con đường tốt hơn để chọn sẽ là ~/Library/Caches/pip
vì nó tuân theo quy ước mà các chương trình OS X khác sử dụng.
pip.conf
một download_cache
cài đặt trỏ đến cùng thư mục trên toàn hệ thống.
PIP_DOWNLOAD_CACHE có một số vấn đề nghiêm trọng. Quan trọng nhất, nó mã hóa tên máy chủ của tải xuống vào bộ đệm, vì vậy việc sử dụng máy nhân bản trở nên không thể.
Cách tốt hơn để quản lý bộ đệm của các bản tải xuống pip là tách bước "tải gói" khỏi bước "cài đặt gói". Các tệp đã tải xuống thường được gọi là "tệp sdist" (phân phối nguồn) và tôi sẽ lưu trữ chúng trong thư mục $ SDIST_CACHE.
Hai bước cuối cùng là:
pip install --no-install --use-mirrors -I --download=$SDIST_CACHE <package name>
Cái nào sẽ tải xuống gói và đặt nó trong thư mục được trỏ bởi $ SDIST_CACHE. Nó sẽ không cài đặt gói. Và sau đó bạn chạy:
pip install --find-links=file://$SDIST_CACHE --no-index --index-url=file:///dev/null <package name>
Để cài đặt gói vào môi trường ảo của bạn. Lý tưởng nhất là $ SDIST_CACHE sẽ được cam kết dưới sự kiểm soát nguồn của bạn. Khi triển khai vào sản xuất, bạn sẽ chỉ chạy lệnh pip thứ hai để cài đặt các gói mà không tải chúng xuống.
Bắt đầu từ phiên bản 6.0 , pip
giờ đây bộ nhớ đệm của riêng nó:
- ĐẠI DIỆN
pip install --download-cache
vàpip wheel --download-cache
cờ dòng lệnh đã không được chấp nhận và chức năng bị xóa. Vì bây giờ pip tự động định cấu hình và sử dụng bộ đệm HTTP bên trong, nó thay thế các--download-cache
tùy chọn hiện có đã được thực hiện không hoạt động nhưng vẫn sẽ được chấp nhận cho đến khi loại bỏ chúng trong pip v8.0. Để biết thêm thông tin, vui lòng xem https://pip.pypa.io/en/latest/reference/pip_install.html#caching
Thêm thông tin từ liên kết trên :
Bắt đầu với v6.0, pip cung cấp một bộ đệm theo mặc định có chức năng tương tự như của trình duyệt web. Mặc dù bộ đệm được bật theo mặc định và được thiết kế để thực hiện đúng theo mặc định, bạn có thể tắt bộ đệm và luôn truy cập PyPI bằng cách sử dụng
--no-cache-dir
tùy chọn.
Pip wheel là một tùy chọn tuyệt vời thực hiện những gì bạn muốn với tính năng bổ sung là biên dịch trước các gói. Từ các tài liệu chính thức :
Xây dựng bánh xe cho một yêu cầu (và tất cả các phụ thuộc của nó):
$ pip wheel --wheel-dir=/tmp/wheelhouse SomePackage
Bây giờ /tmp/wheelhouse
thư mục của bạn có tất cả các phụ thuộc được biên dịch trước, vì vậy bạn có thể sao chép thư mục sang máy chủ khác và cài đặt mọi thứ bằng lệnh này:
$ pip install --no-index --find-links=/tmp/wheelhouse SomePackage
Lưu ý rằng không phải tất cả các gói sẽ hoàn toàn di động trên các máy. Một số gói sẽ được xây dựng riêng cho phiên bản Python, phân phối hệ điều hành và / hoặc kiến trúc phần cứng mà bạn đang sử dụng. Điều đó sẽ được chỉ định trong tên tệp, như -cp27-none-linux_x86_64
đối với CPython 2.7 trên Linux 64 bit, v.v.
Chỉ sử dụng pip (phiên bản của tôi là 1.2.1), bạn cũng có thể xây dựng một kho lưu trữ cục bộ như thế này:
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
Trong cuộc gọi đầu tiên của pip, các gói từ tệp yêu cầu được tra cứu trong kho lưu trữ cục bộ (chỉ), sau đó được cài đặt từ đó. Nếu thất bại, pip lấy các gói từ vị trí thông thường của nó (ví dụ PyPI) và tải nó xuống PIP_SDIST_INDEX
(nhưng không cài đặt gì cả!). Cuộc gọi đầu tiên được "lặp lại" để cài đặt đúng gói từ chỉ mục cục bộ.
( --download-cache
tạo tên tệp cục bộ là URL hoàn chỉnh (đã thoát) và pip không thể sử dụng tên này làm chỉ mục với --find-links
. --download-cache
Sẽ sử dụng tệp được lưu trong bộ nhớ cache, nếu tìm thấy. Chúng tôi có thể thêm tùy chọn này vào lệnh gọi thứ hai của pip, nhưng vì chỉ mục đã hoạt động như một loại bộ đệm, nó không nhất thiết phải mang lại nhiều. Chẳng hạn, nó sẽ giúp ích nếu chỉ mục của bạn được làm trống.)
Có một giải pháp mới cho điều này được gọi là pip-accel , một sự thay thế thả vào cho pip
bộ nhớ đệm được tích hợp.
Chương trình pip-accel là một trình bao bọc cho pip, trình quản lý gói Python. Nó tăng tốc việc sử dụng pip để khởi tạo các môi trường ảo Python được cung cấp một hoặc nhiều tệp yêu cầu. Nó làm như vậy bằng cách kết hợp hai cách tiếp cận sau:
Tải xuống phân phối nguồn được lưu trữ và được sử dụng để tạo chỉ mục lưu trữ phân phối nguồn cục bộ.
Phân phối nhị phân được sử dụng để tăng tốc quá trình cài đặt các phụ thuộc với các thành phần nhị phân (như M2Crypto và LXML). Thay vì biên dịch lại các phụ thuộc này một lần nữa cho mọi môi trường ảo, chúng tôi biên dịch chúng một lần và lưu kết quả dưới dạng phân phối nhị phân * .tar.gz.
Paylogic sử dụng pip-accel để khởi tạo nhanh chóng và đáng tin cậy các môi trường ảo trong trang trại nô lệ tích hợp liên tục đang chạy thử nghiệm đơn vị (đây là một trong những trường hợp sử dụng ban đầu được phát triển pip-accel). Chúng tôi cũng sử dụng nó trên các máy chủ xây dựng của chúng tôi.
Chúng tôi đã thấy khoảng 10 lần tăng tốc từ chuyển từ pip
sang pip-accel
.
Một lựa chọn đơn giản hơn là basket
.
Đặt tên gói, nó sẽ tải xuống và tất cả các phụ thuộc vào một vị trí trung tâm; không có bất kỳ nhược điểm nào của bộ đệm pip. Điều này là tuyệt vời để sử dụng ngoại tuyến.
Sau đó, bạn có thể sử dụng thư mục này làm nguồn cho pip
:
pip install --no-index -f file:///path/to/basket package
Hoặc easy_install
:
easy_install -f ~/path/to/basket -H None package
Bạn cũng có thể sử dụng nó để cập nhật giỏ hàng bất cứ khi nào bạn trực tuyến.
Tôi nghĩ rằng gói "pip-accel" phải là một lựa chọn tốt.