Làm cách nào để cài đặt từ bộ đệm cục bộ với pip?


142

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.


1
Lưu ý rằng kể từ pip 6.0 (2014-12-22), pip sẽ lưu cache theo mặc định. Xem pip.pypa.io/en/urdy/reference/pip_install.html#caching để biết chi tiết.
Pi Delport 24/2/2015

Nó không chỉ làm giảm thời gian tải xuống băng thông, nó còn có thể loại bỏ thời gian thu thập chỉ số PyPI để kiểm tra các phiên bản có sẵn của gói và nếu bạn đang lưu trữ bánh xe, nó có thể loại bỏ thời gian xây dựng bánh xe cho các gói không cung cấp chúng . Nó thêm vào để tăng tốc độ rất đáng kể.
Jonathan Hartley

Câu trả lời:


125

Cập nhật câu trả lời 19-ngày 15 tháng 11

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-dirtù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.

Câu trả lời gốc

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

Ghi chú

  1. Nếu một phiên bản mới hơn của gói được phát hiện, nó sẽ được tải xuống và thêm vào PIP_DOWNLOAD_CACHE thư mục. Ví dụ, bây giờ tôi có khá nhiều gói Django.
  2. Điều này không loại bỏ nhu cầu truy cập mạng, như đã nêu trong tin tức pip , vì vậy đây không phải là câu trả lời cho việc tạo mới virtualenvstrên máy bay, nhưng nó vẫn rất tuyệt.

4
Có lẽ ý tưởng tốt hơn là đưa nó vào .bashrc, vì bash_profile chỉ được thực thi trong khi đăng nhập. Điều đó tùy thuộc vào bạn, và dù sao đó cũng là một lời khuyên tốt :)
Nikita Hismatov

1
Trên máy Mac, nó được tải ở đầu của bất kỳ shell nào.
saul.shanabrook

3
PIP_DOWNLOAD_CACHE rất thiếu sót và tôi không khuyên bạn nên sử dụng nó cho những việc như đưa các gói ra máy triển khai của bạn. Nó cũng vẫn dựa vào pypi.python.org có thể truy cập được. Tuyệt vời cho bộ đệm phát triển cục bộ, nhưng không phù hợp cho sử dụng nặng hơn.
Slacy

1
@slacy Bạn có thể bình luận về lý do tại sao nó là thiếu sót nghiêm trọng? Nếu bạn không muốn PyPI có thể truy cập được, thì đó là - chỉ số dành cho; một bộ đệm tải xuống chắc chắn là trực giao để đạt PyPI hay không!
lvh

@lvh câu trả lời slacy của dưới đây giải thích lý do tại sao bộ nhớ cache tải Pip của là thiếu sót. Thật kỳ lạ, tôi cũng thấy cài đặt pip mất nhiều thời gian hơn khi bật bộ đệm. pip-accelgiỏ dường như là lựa chọn tốt hơn.
qris

52

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:

  1. Để 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
    
  2. Để 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
    
  3. Để 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.


+1 pip2pip hoạt động tuyệt vời !! Tôi không thích dựa vào kết nối mạng nhiều như vậy. Nó thất bại khi bạn cần nó nhất.
MGP

Điều này hoạt động rất tốt, nó trả lời câu hỏi stackoverflow.com/questions/18052217/ của tôi , bạn có thể trả lời không?
Larry Cai

1
Có thể nó được ngụ ý, nhưng điều đáng nói là rõ ràng: pip2tgzphá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.
clacke

32

Đối với các phiên bản Pip mới hơ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

Đối với các phiên bản Pip cũ hơn:

Tạo một tệp cấu hình có tên ~/.pip/pip.confvà 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/pipvì nó tuân theo quy ước mà các chương trình OS X khác sử dụng.


Và nếu tôi muốn lưu trữ chúng trên toàn cầu cho những người dùng khác của cùng một PC truy cập? Làm thế nào tôi có thể làm điều đó? Tôi hình dung tập tin cấu hình sẽ phải được đặt trong / etc hoặc một cái gì đó.
Batandwa

@batandwa: Điều đó có thể làm việc. Nếu không, bạn có thể thử điều này: đảm bảo rằng tất cả người dùng có pip.confmột download_cachecài đặt trỏ đến cùng thư mục trên toàn hệ thống.
Flimm

28

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.


Gabriel - Nó không được tải xuống hai lần, chỉ một lần trong bước đầu tiên và sau đó được cài đặt từ bộ đệm cục bộ trong lần thứ hai. Bạn đang nhìn cái gì vậy?
Slacy

Nếu tôi chạy bước đầu tiên hai lần, nó sẽ tải xuống hai lần, phải không? Ít nhất nó đã xảy ra ở đây. Tôi sẽ cần biết rằng bước đầu tiên đã được thực hiện cho gói này ít nhất một lần trước khi thực hiện nó, nếu không nó sẽ tải xuống cùng một tệp hai lần. Làm thế nào tôi có thể kiểm tra nếu tôi cần phải thực thi nó hoặc nó đã được tải xuống trước đó?
Gabriel Jordão

Bạn có thể chỉ muốn sử dụng pip2pi như câu trả lời khác cho thấy. :)
slacy

Điều này có tải xuống các phụ thuộc là tốt?
monkut

Tôi sử dụng pip 18.1 và tùy chọn - không cài đặt. Bất kỳ ý tưởng về cách cập nhật câu trả lời này?
paolof89

13

Bắt đầu từ phiên bản 6.0 , pipgiờ đây bộ nhớ đệm của riêng nó:

  • ĐẠI DIỆN pip install --download-cachepip wheel --download-cachecờ 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-cachetù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-dirtùy chọn.


9

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/wheelhousethư 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.


3

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-cachetạ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-cacheSẽ 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.)


3

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 pipbộ 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ừ pipsang pip-accel.


2

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.


Hạn chế (từ trang chính thức): Rổ chỉ tải xuống các bản phân phối nguồn, nó không thể tải xuống các gói không được lưu trữ trên PyPI và nó bỏ qua các yêu cầu phiên bản (ví dụ: "mũi> = 1.1.2"), luôn tải xuống phiên bản mới nhất.
hdiogenes

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.