pip를 사용하여 로컬 캐시에서 어떻게 설치합니까?


142

다른 virtualenv 환경 에 동일한 패키지를 많이 설치 합니다. 패키지를 한 번 다운로드 한 다음 로컬 캐시에서 pip를 설치할 수있는 방법이 있습니까?

다운로드 대역폭과 시간이 줄어 듭니다.


1
pip 6.0 (2014-12-22) 기준으로 pip는 기본적으로 캐시됩니다. 자세한 내용은 pip.pypa.io/en/stable/reference/pip_install.html#caching 을 참조하십시오.
Pi Delport

다운로드 대역폭 시간을 줄이는 것뿐만 아니라 PyPI 인덱스를 크롤링하여 사용 가능한 패키지 버전을 확인하는 데 걸리는 시간을 없애고 바퀴를 캐싱하는 경우 패키지를 제공하지 않는 패키지의 바퀴를 만드는 데 소요되는 시간을 제거 할 수 있습니다 . 속도가 크게 향상됩니다.
Jonathan Hartley

답변:


125

업데이트 된 답변 19-Nov-15

Pip 설명서 에 따르면 :

v6.0부터는 pip는 기본적으로 웹 브라우저의 캐시와 유사한 기능을하는 캐시를 제공합니다. 캐시는 기본적으로 켜져 있고 기본적으로 올바른 작업을 수행하도록 설계되어 있지만 --no-cache-dir옵션을 사용하여 캐시를 비활성화하고 항상 PyPI에 액세스 할 수 있습니다 .

따라서 업데이트 캐시는 다운로드 캐시를 원할 경우 기본값으로 pip를 사용하는 것입니다.

원래 답변

로부터 핍 뉴스 , 버전 0.1.4 :

패키지 다운로드를 캐시 할 환경 변수 $ PIP_DOWNLOAD_CACHE에 대한 지원이 추가되었으므로 향후 설치에는 큰 다운로드가 필요하지 않습니다. 네트워크 액세스는 여전히 필요하지만 이것을 사용할 때 일부 다운로드는 피할 수 있습니다.

이를 활용하기 위해 다음을 추가했습니다 ~/.bash_profile.

export PIP_DOWNLOAD_CACHE=$HOME/.pip_download_cache

또는 Mac을 사용하는 경우 :

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

노트

  1. 최신 버전의 패키지가 발견되면 다운로드하여 PIP_DOWNLOAD_CACHE디렉토리에 추가합니다 . 예를 들어, 이제 꽤 많은 장고 패키지가 있습니다.
  2. 이것은 pip news에 명시된 것처럼 네트워크 액세스의 필요성을 제거하지 않으므로 virtualenvs비행기에서 새로운 것을 만드는 데 대한 대답은 아니지만 여전히 훌륭합니다.

4
bash_profile은 로그인 중에 만 실행되기 때문에 .bashrc에 넣는 것이 더 좋습니다. 그것은 당신에게 달려 있으며, 어쨌든 그것은 좋은 조언입니다 :)
Nikita Hismatov

1
Mac에서는 쉘의 시작 부분에로드됩니다.
saul.shanabrook

3
PIP_DOWNLOAD_CACHE에 심각한 결함이 있으므로 배포 시스템으로 패키지를 가져 오는 것과 같은 작업에는 사용하지 않는 것이 좋습니다. 또한 여전히 pypi.python.org에 연결할 수 있습니다. 로컬 개발 캐시에는 적합하지만 더 많은 용도에는 적합하지 않습니다.
slacy

1
@slacy 심각한 결함이있는 이유에 대해 언급 해 주시겠습니까? PyPI에 접근하기를 원하지 않는다면, --no-index의 목적입니다. 다운로드 캐시는 반드시 PyPI에 도달했는지 여부와 직교합니다!
lvh

아래 @lvh slacy의 답변 은 Pip의 다운로드 캐시에 결함이있는 이유를 설명합니다. 또한 캐시를 활성화하고 기괴하게 pip 설치가 오래 걸리는 것을 보았습니다. 핍 가속바구니 가 더 나은 옵션으로 보입니다.
qris

52

제 생각에는 pip2pi이 문제에 대한 훨씬 더 우아하고 신뢰할 수있는 솔루션입니다.

문서에서 :

pip2pi는 pip 요구 사항에서 PyPI 호환 패키지 저장소를 빌드합니다.

pip2pi 두 가지 간단한 명령을 사용하여 자신의 PyPI 색인을 만들 수 있습니다.

  1. 패키지와 모든 요구 사항을 미러링하려면 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. 이전 디렉토리에서 패키지 색인을 빌드하려면 다음을 수행하십시오.

    $ 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 단계에서 빌드 한 색인에서 설치하려면 다음을 사용하면됩니다.

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

를 사용하여 자신의 인덱스를 원격 호스트에 미러링 할 수도 있습니다 pip2pi.


+1 pip2pip는 훌륭하게 작동합니다! 나는 네트워크 연결에 크게 의존하는 것을 좋아하지 않습니다. 가장 필요할 때 실패합니다.
MGP

이 내 질문에 대답, 좋은 작품 stackoverflow.com/questions/18052217/...을 뿐만 아니라 거기에 대답 YON 수있다?
Larry Cai

1
아마도 암시 적이지만 명시 적으로 언급 할 가치가 pip2tgz있습니다. 패키지를 지정된 디렉토리에 이미 다운로드했는지 감지하여 종속성이 겹치는 동일한 설치 라인 또는 여러 설치 라인을 실행하면 각 패키지를 한 번만 다운로드합니다.
clacke

32

최신 Pip 버전의 경우 :

최신 Pip 버전은 이제 기본적으로 다운로드를 캐시합니다. 이 설명서를 참조하십시오 :

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

이전 Pip 버전의 경우 :

이라는 구성 파일을 작성 ~/.pip/pip.conf하고 다음 내용을 추가하십시오.

[global]
download_cache = ~/.cache/pip

OS X에서 ~/Library/Caches/pip다른 OS X 프로그램이 사용하는 규칙을 따르기 때문에 선택하는 것이 좋습니다 .


그리고 같은 PC의 다른 사용자가 액세스 할 수 있도록 전 세계에 저장하려면? 어떻게해야합니까? 설정 파일을 / etc 또는 다른 곳에 배치해야한다고 생각합니다.
Batandwa

@ batandwa : 작동 할 수 있습니다. 그렇지 않다면, 당신이 시도 할 수 : 반드시 모든 사용자가이 있는지 확인 pip.confdownload_cache설정하는 것과 같은 시스템 전체 디렉토리를 가리 킵니다.
Flimm

28

PIP_DOWNLOAD_CACHE에는 심각한 문제가 있습니다. 가장 중요한 것은 다운로드의 호스트 이름을 캐시로 인코딩하므로 미러 사용이 불가능하다는 것입니다.

pip 다운로드 캐시를 관리하는 더 좋은 방법은 "패키지 다운로드"단계와 "패키지 설치"단계를 분리하는 것입니다. 다운로드 된 파일은 일반적으로 "sdist files"(소스 배포)라고하며 $ SDIST_CACHE 디렉토리에 저장합니다.

두 단계는 다음과 같습니다.

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

패키지를 다운로드하여 $ SDIST_CACHE가 가리키는 디렉토리에 배치합니다. 패키지를 설치하지 않습니다. 그런 다음 다음을 실행하십시오.

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

가상 환경에 패키지를 설치합니다. 이상적으로 $ SDIST_CACHE는 소스 제어하에 커밋됩니다. 프로덕션 환경에 배포 할 때는 두 번째 pip 명령 만 실행하여 패키지를 다운로드하지 않고 설치합니다.


Gabriel-첫 번째 단계에서 한 번만 두 번 다운로드 된 다음 두 번째 단계에서 로컬 캐시에서 설치됩니다. 당신은 무엇을보고 있습니까?
slacy

첫 번째 단계를 두 번 실행하면 두 번 다운로드됩니다. 적어도 여기에서 일어났다. 패키지를 실행하기 전에 적어도 한 번은이 패키지에 대해 첫 번째 단계가 실행되었다는 것을 알아야합니다. 그렇지 않으면 동일한 파일을 두 번 다운로드합니다. 실행해야하는지 또는 이전에 다운로드되었는지 어떻게 확인할 수 있습니까?
Gabriel Jordão

다른 답변에서 제안하는 것처럼 pip2pi를 사용하고 싶을 것입니다. :)
slacy

이 종속성도 다운로드합니까?
monkut

pip 18.1을 사용하고 --no-install 옵션이 없습니다. 이 답변을 업데이트하는 방법에 대한 아이디어가 있습니까?
paolof89

13

부터 버전 6.0 , pip지금은 자신의 캐싱입니다 않습니다 :

  • DEPRECATION pip install --download-cachepip wheel --download-cache명령 행 플래그는 더 이상 사용되지 않으며 기능이 제거되었습니다. pip는 자동으로 내부 HTTP 캐시를 구성하고 사용하므로 --download-cache기존 옵션이 작동하지 않게되었지만 pip v8.0에서 제거 될 때까지 계속 허용됩니다. 자세한 내용은 https://pip.pypa.io/en/latest/reference/pip_install.html#caching을 참조 하십시오.

위의 링크 에서 추가 정보 :

v6.0부터는 pip는 기본적으로 웹 브라우저의 캐시와 유사한 기능을하는 캐시를 제공합니다. 캐시는 기본적으로 켜져 있고 기본적으로 올바른 작업을 수행하도록 설계되어 있지만 --no-cache-dir옵션을 사용하여 캐시를 비활성화하고 항상 PyPI에 액세스 할 수 있습니다 .


9

핍 휠 은 패키지를 사전 컴파일하는 추가 기능으로 원하는 것을 수행하는 훌륭한 옵션입니다. 로부터 공식 문서 :

요구 사항 및 모든 종속 항목에 대한 휠을 작성하십시오.

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

이제 /tmp/wheelhouse디렉토리에는 모든 종속성이 사전 컴파일되어 있으므로 폴더를 다른 서버에 복사하고 다음 명령으로 모든 것을 설치할 수 있습니다.

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

모든 패키지가 모든 시스템에서 완전히 이식 가능하지는 않습니다. 일부 패키지는 사용중인 Python 버전, OS 배포 및 / 또는 하드웨어 아키텍처를 위해 특별히 제작됩니다. -cp27-none-linux_x86_6464 비트 Linux 등에서 CPython 2.7 과 같이 파일 이름으로 지정됩니다 .


3

pip 만 사용하면 (내 버전은 1.2.1 임) 다음과 같은 로컬 저장소를 구축 할 수도 있습니다.

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의 첫 번째 호출에서 요구 사항 파일의 패키지는 로컬 리포지토리에서 조회 된 후 해당 저장소에서 설치됩니다. 실패하면 pip는 일반적인 위치 (예 : PyPI)에서 패키지를 검색하여 패키지를 다운로드 PIP_SDIST_INDEX하지만 설치하지는 않습니다! 첫 번째 호출은 로컬 인덱스에서 패키지를 올바르게 설치하기 위해 "반복"됩니다.

( --download-cache완전한 (이스케이프 된) URL 인 로컬 파일 이름을 생성하며, pip는이 인덱스를 인덱스로 사용할 수 없습니다 --find-links. --download-cache캐시 된 파일을 찾은 경우 캐시 된 파일을 사용합니다. pip의 두 번째 호출에이 옵션을 추가 할 수 있지만 인덱스 이후 이미 일종의 캐시로 작동하기 때문에 반드시 많은 것을 가져올 필요는 없습니다 (예 : 색인을 비우면 도움이됩니다).


3

캐싱이 내장 된 드롭 인 대체품 인 pip-accel 이라는 새로운 솔루션이 pip있습니다.

pip-accel 프로그램은 Python 패키지 관리자 인 pip의 래퍼입니다. 하나 이상의 요구 사항 파일이 제공된 Python 가상 환경을 초기화하기 위해 pip 사용을 가속화합니다. 다음 두 가지 접근 방식을 결합하면됩니다.

  • 소스 배포 다운로드는 캐시되어 소스 배포 아카이브의 로컬 인덱스를 생성하는 데 사용됩니다.

  • 이진 배포는 이진 구성 요소 (M2Crypto 및 LXML 등)를 사용하여 종속성을 설치하는 프로세스 속도를 높이는 데 사용됩니다. 모든 가상 환경에 대해 이러한 종속성을 다시 컴파일하는 대신 한 번 컴파일하고 결과를 이진 * .tar.gz 배포로 캐시합니다.

Paylogic은 pip-accel을 사용하여 지속적으로 단위 테스트를 실행하는 지속적 통합 슬레이브 팜의 가상 환경을 빠르고 안정적으로 초기화합니다 (pip-accel이 개발 된 최초의 사용 사례 중 하나임). 빌드 서버에서도 사용합니다.

에서 (으)로 전환하는 속도가 약 10 배 증가 pip했습니다 pip-accel.


2

더 간단한 옵션은 basket입니다.

패키지 이름이 주어지면 패키지와 모든 종속성을 중앙 위치로 다운로드합니다. pip 캐시의 단점이 없습니다. 오프라인 사용에 좋습니다.

그런 다음이 디렉토리를 소스로 사용할 수 있습니다 pip.

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

또는 easy_install:

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

온라인 상태 일 때 바구니를 사용하여 바구니를 업데이트 할 수도 있습니다.


제한 사항 (공식 페이지에서) : 바스켓은 소스 배포 만 다운로드하며 PyPI에서 호스팅되지 않는 패키지를 다운로드 할 수 없으며 버전 요구 사항 (예 : "nose> = 1.1.2")을 무시하고 항상 최신 버전을 다운로드합니다.
hdiogenes

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.