Como instalo a partir de um cache local com pip?

142

Eu instalo muitos dos mesmos pacotes em diferentes ambientes de virtualenv . Existe uma maneira de baixar um pacote uma vez e depois instalar o pip a partir de um cache local?

Isso reduziria a largura de banda e o tempo de download.

Matthew Rankin
fonte
1
Observe que a partir do pip 6.0 (22-12-2014), o pip armazenará em cache por padrão. Consulte pip.pypa.io/en/stable/reference/pip_install.html#caching para obter detalhes.
Delport Pi
Ele não apenas reduz o tempo da largura de banda do download, mas também elimina o tempo gasto no rastreamento do índice PyPI para verificar as versões disponíveis dos pacotes e, se você estiver armazenando em cache rodas, pode eliminar o tempo gasto construindo rodas para pacotes que não os fornecem . Isso adiciona um aumento de velocidade muito substancial.
9788 Jonathan

Respostas:

125

Resposta atualizada 19-Nov-15

De acordo com a documentação do Pip :

A partir da v6.0, o pip fornece um cache ativado por padrão, que funciona de maneira semelhante à de um navegador da web. Enquanto o cache está ativado por padrão e é projetado para fazer a coisa certa por padrão, você pode desativar o cache e sempre acessar o PyPI utilizando a --no-cache-diropção

Portanto, a resposta atualizada é usar apenas o pip com seus padrões, se você quiser um cache de download.

Resposta original

Das notícias do pip , versão 0.1.4:

Adicionado suporte para uma variável de ambiente $ PIP_DOWNLOAD_CACHE que armazenará em cache downloads de pacotes, para que futuras instalações não exijam downloads grandes. O acesso à rede ainda é necessário, mas apenas alguns downloads serão evitados ao usar isso.

Para tirar proveito disso, adicionei o seguinte ao meu ~/.bash_profile:

export PIP_DOWNLOAD_CACHE=$HOME/.pip_download_cache

ou, se você estiver em um Mac:

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

Notas

  1. Se uma versão mais recente de um pacote for detectada, ela será baixada e adicionada ao PIP_DOWNLOAD_CACHEdiretório. Por exemplo, agora tenho muitos pacotes Django.
  2. Isso não elimina a necessidade de acesso à rede, conforme declarado nas notícias do pip , portanto, não é a resposta para a criação de novidades virtualenvsno avião, mas ainda é excelente.
Matthew Rankin
fonte
4
Talvez a melhor idéia seja colocá-lo em .bashrc, porque o bash_profile é executado apenas durante o login. Isso é com você, e de qualquer maneira é um bom conselho :) #
Nikita Hismatov
1
Nos macs, ele é carregado no início de qualquer shell.
saul.shanabrook
3
PIP_DOWNLOAD_CACHE está seriamente defeituoso e eu não recomendaria usá-lo para coisas como enviar pacotes para suas máquinas de implantação. Também ainda depende do pypi.python.org ser alcançável. Ótimo para um cache de desenvolvimento local, mas não adequado para usos mais pesados.
slacy 25/09/12
1
@slacy Você poderia comentar por que é seriamente falho? Se você não deseja que o PyPI esteja acessível, é para isso que serve --no-index; um cache de download certamente é ortogonal para alcançar o PyPI ou não!
Lvh 01/12/2013
A resposta da @lvh slacy abaixo explica por que o cache de download do Pip é defeituoso. Também vi a instalação do pip demorando mais tempo com o cache ativado, de forma bizarra. pip-accel e basket parecem ser melhores opções.
QRIS
52

Na minha opinião, pip2pié uma solução muito mais elegante e confiável para esse problema.

Dos documentos:

O pip2pi cria um repositório de pacotes compatível com PyPI a partir dos requisitos do pip

pip2pi permite criar seu próprio índice PyPI usando dois comandos simples:

  1. Para espelhar um pacote e todos os seus requisitos, use 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. Para criar um índice de pacote a partir do diretório anterior:

    $ 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. Para instalar a partir do índice que você criou na etapa 2., você pode simplesmente usar:

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

Você pode até espelhar seu próprio índice em um host remoto com pip2pi.

KZ
fonte
+1 pip2pip funciona muito bem !! Não gosto muito de confiar na conectividade de rede. Falha quando você mais precisa.
MGP
isso funciona muito bem, responde à minha pergunta stackoverflow.com/questions/18052217/… , você também pode responder lá?
Larry Cai
1
Talvez tenha sido implícito, mas vale a pena mencionar explicitamente: pip2tgzdetecta se você já baixou o pacote para o diretório designado; portanto, se você executar a mesma linha de instalação ou várias linhas de instalação com dependências sobrepostas, ele fará o download de cada pacote apenas uma vez.
clacke
32

Para versões mais recentes do Pip:

As versões mais recentes do Pip agora armazenam em cache os downloads por padrão. Consulte esta documentação:

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

Para versões mais antigas do Pip:

Crie um arquivo de configuração chamado ~/.pip/pip.confe adicione o seguinte conteúdo:

[global]
download_cache = ~/.cache/pip

No OS X, um caminho melhor para escolher seria ~/Library/Caches/pipseguir a convenção que outros programas do OS X usam.

Flimm
fonte
E se eu quisesse armazená-los globalmente para outros usuários do mesmo PC acessarem? Como eu faria isso? Eu acho que o arquivo de configuração teria que ser colocado em / etc ou algo assim.
Batandwa
@batandwa: Isso pode funcionar. Caso contrário, você pode tentar o seguinte: verifique se todos os usuários possuem pip.confuma download_cacheconfiguração que aponte para o mesmo diretório de todo o sistema.
Flimm
28

PIP_DOWNLOAD_CACHE tem alguns problemas sérios. Mais importante, ele codifica o nome do host do download no cache, portanto, o uso de espelhos se torna impossível.

A melhor maneira de gerenciar um cache de downloads de pip é separar a etapa "baixar o pacote" da etapa "instalar o pacote". Os arquivos baixados são comumente referidos como "arquivos sdist" (distribuições de origem) e eu os armazenarei em um diretório $ SDIST_CACHE.

Os dois passos acabam sendo:

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

O qual fará o download do pacote e o colocará no diretório apontado por $ SDIST_CACHE. Não instalará o pacote. E então você corre:

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

Para instalar o pacote no seu ambiente virtual. Idealmente, $ SDIST_CACHE seria confirmado sob seu controle de origem. Ao implantar na produção, você executaria apenas o segundo comando pip para instalar os pacotes sem fazer o download deles.

slacy
fonte
Gabriel - Não é baixado duas vezes, apenas uma vez na primeira etapa e depois instalado a partir do cache local na segunda. O que você está vendo?
slacy 25/09/12
Se eu executar o primeiro passo duas vezes, ele fará o download duas vezes, certo? Pelo menos aconteceu aqui. Precisarei saber que a primeira etapa foi executada para este pacote pelo menos uma vez antes de executá-lo, caso contrário, ele fará o download do mesmo arquivo duas vezes. Como posso verificar se preciso executá-lo ou se ele já foi baixado antes?
Gabriel Jordão
Você provavelmente só quer usar pip2pi como a outra resposta sugere. :)
slacy 26/09
isso faz o download das dependências também?
Monkut
Eu uso o pip 18.1 e a opção --no-install não está presente. Alguma idéia de como atualizar esta resposta?
paolof89
13

A partir da versão 6.0 , pipagora o cache é próprio:

  • DEPRECAÇÃO pip install --download-cache e pip wheel --download-cachesinalizadores de linha de comando foram preteridos e a funcionalidade removida. Como o pip agora configura e usa automaticamente seu cache HTTP interno, o que substitui as --download-cacheopções existentes que foram tornadas não funcionais, mas ainda serão aceitas até sua remoção no pip v8.0. Para obter mais informações, consulte https://pip.pypa.io/en/latest/reference/pip_install.html#caching

Mais informações no link acima :

A partir da v6.0, o pip fornece um cache ativado por padrão, que funciona de maneira semelhante à de um navegador da web. Enquanto o cache está ativado por padrão e é projetado para fazer a coisa certa por padrão, você pode desativar o cache e sempre acessar o PyPI utilizando a --no-cache-diropção

Jace Browning
fonte
9

O pip wheel é uma excelente opção que faz o que você deseja com o recurso extra de pré-compilar os pacotes. Dos documentos oficiais :

Crie rodas para um requisito (e todas as suas dependências):

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

Agora seu /tmp/wheelhousediretório tem todas as suas dependências pré-compiladas, para que você possa copiar a pasta para outro servidor e instalar tudo com este comando:

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

Observe que nem todos os pacotes serão completamente portáteis entre as máquinas. Alguns pacotes serão criados especificamente para a versão Python, distribuição do SO e / ou arquitetura de hardware que você está usando. Isso será especificado no nome do arquivo, como -cp27-none-linux_x86_64para o CPython 2.7 em um Linux de 64 bits, etc.

hdiogenes
fonte
3

Usando apenas o pip (minha versão é 1.2.1), você também pode criar um repositório local como este:

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

Na primeira chamada do pip, os pacotes do arquivo de requisitos são consultados no repositório local (apenas) e depois instalados a partir daí. Se isso falhar, o pip recupera os pacotes da sua localização usual (por exemplo, PyPI) e baixa-os para o PIP_SDIST_INDEX(mas não instala nada!). A primeira chamada é "repetida" para instalar corretamente o pacote a partir do índice local.

( --download-cachecria um nome de arquivo local que é a URL completa (com escape), e o pip não pode usá-lo como um índice com --find-links. --download-cacheirá usar o arquivo em cache, se encontrado. Poderíamos adicionar essa opção à segunda chamada do pip, mas desde o índice já funciona como um tipo de cache, não traz necessariamente muito. Seria útil se seu índice fosse esvaziado, por exemplo.)

user1010997
fonte
3

Existe uma nova solução para isso, chamada pip-accel , um substituto para o pipcache incorporado.

O programa pip-accel é um wrapper para o pip, o gerenciador de pacotes Python. Ele acelera o uso do pip para inicializar ambientes virtuais do Python, com um ou mais arquivos de requisitos. Isso é feito combinando as duas abordagens a seguir:

  • Os downloads de distribuição de origem são armazenados em cache e usados ​​para gerar um índice local de arquivos de distribuição de origem.

  • Distribuições binárias são usadas para acelerar o processo de instalação de dependências com componentes binários (como M2Crypto e LXML). Em vez de recompilar essas dependências novamente para cada ambiente virtual, compilamos uma vez e armazenamos em cache o resultado como uma distribuição binária * .tar.gz.

O Paylogic usa o pip-accel para inicializar de forma rápida e confiável ambientes virtuais em seu farm de escravos de integração contínua, que estão constantemente executando testes de unidade (esse foi um dos casos de uso originais para os quais o pip-accel foi desenvolvido). Também o usamos em nossos servidores de compilação.

Vimos um aumento de cerca de 10x na mudança de pippara pip-accel.

qris
fonte
2

Uma opção mais simples é basket.

Dado o nome de um pacote, ele fará o download e todas as dependências para um local central; sem nenhuma das desvantagens do cache pip. Isso é ótimo para uso offline.

Você pode usar esse diretório como fonte para pip:

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

Ou easy_install:

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

Você também pode usá-lo para atualizar a cesta sempre que estiver online.

Burhan Khalid
fonte
Limitações (da página oficial): O Basket baixa apenas as distribuições de origem, não pode baixar pacotes que não estão hospedados no PyPI e ignora os requisitos de versão (por exemplo, "nariz> = 1.1.2"), sempre baixando a versão mais recente.
hdiogenes
0

Eu acho que o pacote "pip-accel" deve ser uma boa escolha.

lasthuman
fonte