Como instalar pacotes offline?

160

Qual é a melhor maneira de baixar um pacote python e suas dependências do pypi para instalação offline em outra máquina? Existe alguma maneira fácil de fazer isso com pip ou easy_install? Estou tentando instalar a biblioteca de solicitações em uma caixa do FreeBSD que não está conectada à Internet.

Chris Drantz
fonte

Respostas:

77

Se o pacote estiver no PYPI, faça o download dele e de suas dependências para algum diretório local. Por exemplo

$ mkdir / pypi && cd / pypi
$ ls -la
  -rw-r - r-- 1 pavel staff 237954 19 de abril às 11:31 Flask-WTF-0.6.tar.gz
  -rw-r - r-- 1 pavel staff 389741 22 de fevereiro às 17:10 Jinja2-2.6.tar.gz
  -rw-r - r-- 1 pavel staff 70305 Abr 11 00:28 MySQL-python-1.2.3.tar.gz
  -rw-r - r-- 1 pavel staff 2597214 10 de abril às 18:26 SQLAlchemy-0.7.6.tar.gz
  -rw-r - r-- 1 pavel staff 1108056 22 de fevereiro às 17:10 Werkzeug-0.8.2.tar.gz
  -rw-r - r-- 1 pavel staff 488207 abr 10 18:26 boto-2.3.0.tar.gz
  -rw-r - r-- 1 pavel staff 490192 abr 16 12:00 flask-0.9-dev-2a6c80a.tar.gz

Alguns pacotes podem ter que ser arquivados em tarballs com aparência semelhante à mão. Faço muito quando quero uma versão mais recente (menos estável) de algo. Alguns pacotes não estão no PYPI, então o mesmo se aplica a eles.

Suponha que você tenha um aplicativo Python formado corretamente ~/src/myapp. ~/src/myapp/setup.pyterá uma install_requireslista que menciona uma ou mais coisas que você possui em seu /pypidiretório. Igual a:

  install_requires=[
    'boto',
    'Flask',
    'Werkzeug',
    # and so on

Se você deseja executar seu aplicativo com todas as dependências necessárias enquanto ainda o faz hackers, faça algo assim:

$ cd ~ / src / myapp
$ python setup.py develop --sempre-descompacte --allow-hosts = None --find-links = / pypi

Dessa forma, seu aplicativo será executado diretamente do seu diretório de origem. Você pode invadir as coisas e executar novamente o aplicativo sem reconstruir nada.

Se você deseja instalar seu aplicativo e suas dependências no ambiente python atual, faça algo assim:

$ cd ~ / src / myapp
$ easy_install - sempre descompacte --allow-hosts = Nenhum - encontrar links = / pypi.

Nos dois casos, a compilação falhará se uma ou mais dependências não estiverem presentes no /pypidiretório. Não tentará instalar promiscuamente coisas ausentes da Internet.

Eu recomendo invocar setup.py develop ...e easy_install ...dentro de um ambiente virtual ativo para evitar contaminar seu ambiente global em Python. É (virtualenv que é) praticamente o caminho a percorrer. Nunca instale nada no ambiente global do Python.

Se a máquina em que você criou seu aplicativo tiver a mesma arquitetura da máquina na qual você deseja implantá-lo, você pode simplesmente marcar o diretório inteiro do ambiente virtual no qual você easy_installcolocou tudo. Porém, antes do tarballing, você deve tornar o diretório do ambiente virtual realocável (consulte a opção --relocatable ). NOTA: a máquina de destino precisa ter a mesma versão do Python instalada e também quaisquer dependências baseadas em C que seu aplicativo possa ter também devem ser pré-instaladas (por exemplo, se você depende de PIL , libpng, libjpeg, etc.) .

Pavel Repin
fonte
3
Em vez de --allow-hosts=Nonevocê poderia usar o switch--no-index
romor
Você pode elaborar como criar um aplicativo Python formado corretamente?
Psr
3
@PrabhjotRai, consulte packaging.python.org/distributing
Pavel Repin
300

O downloadcomando pip permite baixar pacotes sem instalá-los:

pip download -r requirements.txt

(Nas versões anteriores do pip, isso estava escrito pip install --download -r requirements.txt.)

Em seguida, você pode usar pip install --no-index --find-links /path/to/download/dir/ -r requirements.txtpara instalar os sdists baixados, sem acessar a rede.

Carl Meyer
fonte
O problema é que as dependências podem ter outras dependências e não serão baixadas.
111313 vikki
O snake basket (construído sobre o pip) também fará o download das dependências das dependências.
vikki
14
@vikki Não é verdade, "pip install --download" também baixa dependências, portanto os comandos acima funcionarão corretamente mesmo que seus requisitos tenham dependências adicionais. O cesto de cobras pode fazer outras coisas úteis (nunca o usou), mas definitivamente não é necessário por esse motivo.
Carl Meyer
6
@ Vikki Eu entendo o que você está dizendo, mas estou lhe dizendo que não é verdade :-) Você realmente deve tentar antes de postar a mesma afirmação novamente. Acabei de colocar "pytest" no arquivo requirements.txt, executei "pip install --download. -R requirements.txt" e baixou sdists para o pytest e sua dependência do setup.py, "py".
Carl Meyer
3
Eu acho que deveria ser: --find-links file:/path/to/some/dir/e você deve baixar e instalar com a mesma versão do pip - caso contrário, pode falhar
A. Binzxxxxxx
57

Se você deseja instalar as bibliotecas python e suas dependências offline, conclua estas etapas em uma máquina com o mesmo sistema operacional, rede conectada e python instalado:

1) Crie um requirements.txtarquivo com conteúdo semelhante (Nota - estas são as bibliotecas que você deseja baixar):

Flask==0.12
requests>=2.7.0
scikit-learn==0.19.1
numpy==1.14.3
pandas==0.22.0

Uma opção para criar o arquivo de requisitos é usar pip freeze > requirements.txt. Isso listará todas as bibliotecas em seu ambiente. Depois, você pode acessar requirements.txte remover os desnecessários.

2) Execute o comando mkdir wheelhouse && pip download -r requirements.txt -d wheelhousepara baixar as bibliotecas e suas dependências no diretóriowheelhouse

3) Copie requirements.txt para o wheelhousediretório

4) Arquive a casa do leme wheelhouse.tar.gzcomtar -zcf wheelhouse.tar.gz wheelhouse

Em seguida, faça o upload wheelhouse.tar.gzpara sua máquina de destino:

1) Execute tar -zxf wheelhouse.tar.gzpara extrair os arquivos

2) Execute pip install -r wheelhouse/requirements.txt --no-index --find-links wheelhousepara instalar as bibliotecas e suas dependências

chaokunyang
fonte
6
Esta é a resposta mais clara com as etapas adequadas para um iniciante. Graças
kumarharsh
Esta é a maneira mais pitônica que eu já vi até agora. Obrigado!
peluzza 18/04
2
mas seguindo suas instruções, quando eu pip installno final, diz: ERRO: não foi possível encontrar uma versão que atenda aos requisitos .. »
DennisLi
@DennisLi, qual é a sua versão python e pip?
chaokunyang
Eu descobri isso, isso é porque o pip não consegue encontrar a versão específica do pacote pandas no meu requirements.txt, pois eu usei o pip3 para instalar o pandas 0.2
DennisLi
13

python offline. para fazer isso, uso o virtualenv (ambiente Python isolado)

1) instale o virtualenv online com o pip:

pip install virtualenv --user

ou offline com whl: acesse este link , faça o download da última versão (.whl ou tar.gz) e instale-a com este comando:

pip install virtualenv-15.1.0-py2.py3-none-any.whl --user

usando --uservocê não precisa usar sudo pip….

2) use virtualenv

na máquina online, selecione um diretório com terminal cde execute este código:

python -m virtualenv myenv
cd myenv
source bin/activate
pip install Flask

depois de instalar todos os pacotes, você deve gerar um requirements.txtenquanto o seu virtualenv estiver ativo, escreva

pip freeze > requirements.txt

abra um novo terminal e crie outro ambiente myenv2.

python -m virtualenv myenv2
cd myenv2
source bin/activate
cd -
ls

agora você pode ir para sua pasta offline, onde estão suas pasta requirements.txte tranferred_packages. faça o download dos pacotes com o seguinte código e coloque todos eles na tranferred_packagespasta

pip download -r requirements.txt

leve sua pasta offline para o computador offline e depois

python -m virtualenv myenv2
cd myenv2
source bin/activate
cd -
cd offline
pip install --no-index --find-links="./tranferred_packages" -r requirements.txt

o que está na pasta offline [requirements.txt, tranferred_packages {Flask-0.10.1.tar.gz, ...}]

lista de verificação do seu pacote

pip list

nota: como estamos em 2017, é melhor usar o python 3. você pode criar o python 3 virtualenv com este comando.

virtualenv -p python3 envname
cyera
fonte
2
Parece haver etapas ausentes ou "ofuscadas" aqui, eu esperaria ver um 'desativar' e depois 'congelar' ... cd offline e ./tranferred_packages aparecer do nada - claramente isso precisa de uma limpeza?
Hannu
talvez, mas você deve considerar 'Eu queria um breve post', 'esse processo era complexo e não conseguia escrever todas as etapas (isso só é possível no YouTube)'.
precisa saber é
Esta é a melhor resposta imho. Ajuda muito
webofmars 24/10
Essa seria a melhor resposta se dissesse alguma coisa sobre como configurar a pasta tranferred_packages. Sem etapas cruciais, -1
Zim
8

Faça o download do tarball , transfira-o para a sua máquina FreeBSD e extraia-o, depois execute python setup.py installe pronto!

EDIT: Apenas para adicionar isso, você também pode instalar os tarballs com o pip agora.

dav1d
fonte
1
E todas as dependências? Qual é a melhor maneira de resolvê-los? Também preciso instalar as dependências manualmente?
Chris Drantz
Sim, é infelizmente a única maneira que eu sei.
dav1d
8

Deixe-me seguir o processo passo a passo:

  1. Em um computador conectado à Internet, crie uma pasta.
   $ mkdir packages
   $ cd packages
  1. abra um prompt de comando ou shell e execute o seguinte comando:

    Suponha que o pacote que você deseja seja tensorflow

    $ pip download tensorflow

  2. Agora, no computador de destino, copie a packagespasta e aplique o seguinte comando

  $ cd packages
  $ pip install 'tensorflow-xyz.whl' --no-index --find-links '.'

Observe que tensorflow-xyz.whldeve ser substituído pelo nome original da embalagem necessária.

arunanshub
fonte
6

Usando wheel pacotes compilados.

agrupar:

$ tempdir=$(mktemp -d /tmp/wheelhouse-XXXXX)
$ pip wheel -r requirements.txt --wheel-dir=$tempdir
$ cwd=`pwd`
$ (cd "$tempdir"; tar -cjvf "$cwd/bundled.tar.bz2" *)

copie o tarball e instale:

$ tempdir=$(mktemp -d /tmp/wheelhouse-XXXXX)
$ (cd $tempdir; tar -xvf /path/to/bundled.tar.bz2)
$ pip install --force-reinstall --ignore-installed --upgrade --no-index --no-deps $tempdir/*

Nota wheel os pacotes binários não estão entre máquinas.

Mais ref. aqui: https://pip.pypa.io/en/stable/user_guide/#installation-bundles

eshizhan
fonte
1
Tive problemas com o agrupamento na máquina com o Python 3.6 e a extração com outra com o Python 3.5: " <package> .whl não é uma roda suportada nesta plataforma ". As versões de origem e destino podem ser necessárias para corresponder a alguns pacotes.
Juuso Ohtonen
5

Eu tive um problema parecido. E eu tive que fazê-lo instalar da mesma maneira, fazemos com o pypi.

Eu fiz as seguintes coisas:

  1. Crie um diretório para armazenar todos os pacotes na máquina que têm acesso à Internet.

    mkdir -p /path/to/packages/
  2. Faça o download de todos os pacotes para o caminho

    pip download -r requirements.txt -d /path/to/packages
    
    Eg:- ls /root/wheelhouse/  # **/root/wheelhouse** is my **/path/to/packages/**
    total 4524
    -rw-r--r--. 1 root root   16667 May 23  2017 incremental-17.5.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root   34713 Sep  1 10:21 attrs-18.2.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root 3088398 Oct 15 14:41 Twisted-18.9.0.tar.bz2
    -rw-r--r--. 1 root root  133356 Jan 28 15:58 chardet-3.0.4-py2.py3-none-any.whl
    -rw-r--r--. 1 root root  154154 Jan 28 15:58 certifi-2018.11.29-py2.py3-none-any.whl
    -rw-r--r--. 1 root root   57987 Jan 28 15:58 requests-2.21.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root   58594 Jan 28 15:58 idna-2.8-py2.py3-none-any.whl
    -rw-r--r--. 1 root root  118086 Jan 28 15:59 urllib3-1.24.1-py2.py3-none-any.whl
    -rw-r--r--. 1 root root   47229 Jan 28 15:59 tqdm-4.30.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root    7922 Jan 28 16:13 constantly-15.1.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root  164706 Jan 28 16:14 zope.interface-4.6.0-cp27-cp27mu-manylinux1_x86_64.whl
    -rw-r--r--. 1 root root  573841 Jan 28 16:14 setuptools-40.7.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root   37638 Jan 28 16:15 Automat-0.7.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root   37905 Jan 28 16:15 hyperlink-18.0.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root   52311 Jan 28 16:15 PyHamcrest-1.9.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root   10586 Jan 28 16:15 six-1.12.0-py2.py3-none-any.whl
  3. Tarar o diretório de pacotes e copiá-lo para a máquina que não tem acesso à Internet. Então faça,

    cd /path/to/packages/
    tar -cvzf packages.tar.gz .  # not the . (dot) at the end

    Copie o packages.tar.gz na máquina de destino que não possui acesso à Internet.

  4. Na máquina que não possui acesso à Internet, faça o seguinte (Supondo que você tenha copiado os pacotes tarred para / path / to / package / na máquina atual)

    cd /path/to/packages/
    tar -xvzf packages.tar.gz
    mkdir -p $HOME/.config/pip/
    
    vi $HOME/.config/pip/pip.conf

    cole o conteúdo a seguir e salve-o.

    [global]
    timeout = 10
    find-links = file:///path/to/package/
    no-cache-dir = true
    no-index = true
  5. Finalmente, sugiro que você use alguma forma de virtualenvinstalar os pacotes.

    virtualenv -p python2 venv # use python3, if you are on python3
    source ./venv/bin/activate
    pip install <package>

Você deve poder baixar todos os módulos que estão no diretório / path / to / package / .

Nota: Eu fiz isso apenas porque não consegui adicionar opções ou alterar a maneira como instalamos os módulos. Caso contrário, eu teria feito

    pip install --no-index --find-links /path/to/download/dir/ -r requirements.txt
Han Solo
fonte
3

Para o Pip 8.1.2, você pode usar pip download -r requ.txtpara baixar pacotes na sua máquina local.

Umut Gunebakan
fonte