¿Cómo instalar paquetes sin conexión?

160

¿Cuál es la mejor manera de descargar un paquete de python y sus dependencias de pypi para la instalación fuera de línea en otra máquina? ¿Hay alguna manera fácil de hacer esto con pip o easy_install? Estoy tratando de instalar la biblioteca de solicitudes en un cuadro de FreeBSD que no está conectado a Internet.

Chris Drantz
fuente

Respuestas:

77

Si el paquete está en PYPI, descárguelo y sus dependencias en algún directorio local. P.ej

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

Algunos paquetes pueden tener que archivarse en tarballs de aspecto similar a mano. Lo hago mucho cuando quiero una versión más reciente (menos estable) de algo. Algunos paquetes no están en PYPI, por lo que se aplica a ellos.

Supongamos que tiene una aplicación Python correctamente formada en ~/src/myapp. ~/src/myapp/setup.pytendrá una install_requireslista que menciona una o más cosas que tiene en su /pypidirectorio. Al igual que:

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

Si quieres poder ejecutar tu aplicación con todas las dependencias necesarias mientras la pirateas, harás algo como esto:

$ cd ~ / src / myapp
$ python setup.py desarrollo - siempre-descomprimir --allow-hosts = Ninguno --find-links = / pypi

De esta manera, su aplicación se ejecutará directamente desde su directorio de origen. Puedes hackear cosas y luego volver a ejecutar la aplicación sin reconstruir nada.

Si desea instalar su aplicación y sus dependencias en el entorno actual de Python, hará algo como esto:

$ cd ~ / src / myapp
$ easy_install --always-unzip --allow-hosts = None --find-links = / pypi.

En ambos casos, la compilación fallará si una o más dependencias no están presentes en el /pypidirectorio. No intentará instalar de manera promiscua las cosas faltantes de Internet.

Recomiendo invocar setup.py develop ...y easy_install ...dentro de un entorno virtual activo para evitar contaminar su entorno global de Python. Es (virtualenv que es) más o menos el camino a seguir. Nunca instales nada en el entorno global de Python.

Si la máquina en la que ha creado su aplicación tiene la misma arquitectura que la máquina en la que desea implementarla, puede simplemente tarball todo el directorio del entorno virtual en el que easy_installintrodujo todo. Sin embargo, justo antes de tarballing, debe hacer que el directorio del entorno virtual sea reubicable (consulte la opción --relocatable ). NOTA: la máquina de destino debe tener instalada la misma versión de Python, y también las dependencias basadas en C que pueda tener su aplicación también deben estar preinstaladas allí (por ejemplo, si depende de PIL , debe estar preinstalado libpng, libjpeg, etc.) .

Pavel Repin
fuente
3
En lugar de --allow-hosts=Noneusar el interruptor--no-index
romor
¿Puedes explicar cómo crear una aplicación Python correctamente formada?
psr
3
@PrabhjotRai, consulte packaging.python.org/distributing
Pavel Repin el
300

El downloadcomando pip le permite descargar paquetes sin instalarlos:

pip download -r requirements.txt

(En versiones anteriores de pip, esto se deletreaba pip install --download -r requirements.txt).

Luego puede usar pip install --no-index --find-links /path/to/download/dir/ -r requirements.txtpara instalar esos sdists descargados, sin acceder a la red.

Carl Meyer
fuente
El problema con esto es que las dependencias pueden tener otras dependencias y esas no se descargarán.
vikki
La cesta de serpiente (construida sobre el pip) también descargará las dependencias de las dependencias.
vikki
14
@vikki No es cierto, "pip install --download" también descarga dependencias, por lo que los comandos anteriores funcionarán correctamente incluso si sus requisitos tienen dependencias adicionales. La cesta de serpiente puede hacer otras cosas útiles (nunca la usó), pero definitivamente no es necesaria por esa razón.
Carl Meyer
66
@vikki Entiendo lo que dices, pero te digo que no es cierto :-) En realidad, deberías probarlo antes de volver a publicar la misma afirmación. Acabo de poner "pytest" en require.txt, ejecuté "pip install --download. -R require.txt", y descargó sdists para pytest y su dependencia de setup.py, "py".
Carl Meyer
3
Creo que debería ser: --find-links file:/path/to/some/dir/y debe descargar e instalar con la misma versión de pip; de lo contrario, podría fallar
A. Binzxxxxxx
57

Si desea instalar libs de python y sus dependencias fuera de línea, termine de seguir estos pasos en una máquina con el mismo sistema operativo, red conectada y python instalado:

1) Cree un requirements.txtarchivo con contenido similar (Nota: estas son las bibliotecas que desea descargar):

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

Una opción para crear el archivo de requisitos es usar pip freeze > requirements.txt. Esto enumerará todas las bibliotecas en su entorno. Luego puede entrar requirements.txty eliminar los innecesarios.

2) Ejecute el comando mkdir wheelhouse && pip download -r requirements.txt -d wheelhousepara descargar libs y sus dependencias en el directoriowheelhouse

3) Copie requerimientos.txt en el wheelhousedirectorio

4) Archivar la timonera wheelhouse.tar.gzcontar -zcf wheelhouse.tar.gz wheelhouse

Luego cargue wheelhouse.tar.gzen su máquina de destino:

1) Ejecutar tar -zxf wheelhouse.tar.gzpara extraer los archivos

2) Ejecutar pip install -r wheelhouse/requirements.txt --no-index --find-links wheelhousepara instalar las librerías y sus dependencias

chaokunyang
fuente
66
Esta es la respuesta más clara con los pasos adecuados para un principiante. Gracias
kumarharsh
Esta es la forma más pitónica que he visto hasta ahora. ¡Gracias!
peluzza
2
pero siguiendo sus instrucciones, cuando pip installal final, dice: ERROR: no se pudo encontrar una versión que satisfaga el requisito ... '
DennisLi
@DennisLi, ¿cuál es tu versión de python y pip?
chaokunyang
Lo descubrí, porque pip no puede encontrar la versión específica del paquete de pandas en mis requisitos.txt, ya que usé pip3 para instalar los pandas 0.2
DennisLi
13

Python sin conexión. para hacer esto uso virtualenv (entorno aislado de Python)

1) instalar virtualenv en línea con pip:

pip install virtualenv --user

o fuera de línea con whl: vaya a este enlace , descargue la última versión (.whl o tar.gz) e instálela con este comando:

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

al usar --userno necesitas usar sudo pip….

2) usa virtualenv

en la máquina en línea, seleccione un directorio con terminal cdy ejecute este código:

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

después de instalar todos los paquetes, debe generar un mensaje de texto requirements.txtmientras su virtualenv está activo, escriba

pip freeze > requirements.txt

abrir una nueva terminal y crear otro entorno como myenv2.

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

ahora puede ir a su carpeta sin conexión donde están su carpeta requirements.txty tranferred_packagesallí. descargue los paquetes con el siguiente código y póngalos todos en la tranferred_packagescarpeta.

pip download -r requirements.txt

lleve su carpeta fuera de línea a la computadora fuera de línea y luego

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

lo que está en la carpeta fuera de línea [required.txt, tranferred_packages {Flask-0.10.1.tar.gz, ...}]

lista de verificación de su paquete

pip list

nota: como estamos en 2017, es mejor usar python 3. puede crear python 3 virtualenv con este comando.

virtualenv -p python3 envname
cyera
fuente
2
Parece que faltan pasos o están "ofuscados" aquí, esperaría ver un 'desactivar' y luego 'congelar pip' ... cd fuera de línea y ./tranferred_packages aparece de la nada, ¿claramente esto necesita una limpieza?
Hannu
tal vez, pero deberías considerar "quería una breve publicación", "ese proceso fue complejo y no pude escribir cada paso (eso solo es posible en YouTube)".
cyera
Esta es la mejor respuesta en mi humilde opinión. Ayudó mucho
webofmars
Esta sería la mejor respuesta si dijera algo sobre cómo configurar la carpeta tranferred_packages. Sin pasos cruciales, -1
Zim
8

Descargue el tarball , transfiéralo a su máquina FreeBSD y extráigalo, luego ejecútelo python setup.py instally listo.

EDITAR: solo para agregar eso, también puede instalar los tarballs con pip ahora.

dav1d
fuente
1
¿Qué pasa con todas las dependencias? ¿Cuál es la mejor manera de resolverlos? ¿Necesito instalar las dependencias manualmente también?
Chris Drantz
Sí, desafortunadamente esa es la única forma en que lo sé.
dav1d
8

Déjame pasar por el proceso paso a paso:

  1. En una computadora conectada a Internet, cree una carpeta.
   $ mkdir packages
   $ cd packages
  1. abra un símbolo del sistema o shell y ejecute el siguiente comando:

    Supongamos que el paquete que quieres es tensorflow

    $ pip download tensorflow

  2. Ahora, en la computadora de destino, copie la packagescarpeta y aplique el siguiente comando

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

Tenga en cuenta que tensorflow-xyz.whldebe reemplazarse por el nombre original del paquete requerido.

arunanshub
fuente
6

Utilizando wheelpaquetes compilados.

abrigarse:

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

copiar tarball e instalar:

$ 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/*

Tenga en cuenta que wheellos paquetes binarios no están en las máquinas.

Más ref. aquí: https://pip.pypa.io/en/stable/user_guide/#installation-bundles

eshizhan
fuente
1
Tuve problemas al agrupar en la máquina con Python 3.6 y extraer en otro con Python 3.5: " <package> .whl no es una rueda compatible en esta plataforma ". Las versiones de origen y destino pueden ser necesarias para que coincidan con algunos paquetes.
Juuso Ohtonen
6

Tuve un problema similar. Y tuve que hacerlo instalar de la misma manera, lo hacemos desde pypi.

Hice las siguientes cosas:

  1. Haga un directorio para almacenar todos los paquetes en la máquina que tienen acceso a Internet.

    mkdir -p /path/to/packages/
  2. Descargue todos los paquetes a la ruta

    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. Asfalte el directorio de paquetes y cópielo en la máquina que no tiene acceso a Internet. Entonces hazlo,

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

    Copie los paquetes.tar.gz en la máquina de destino que no tiene acceso a Internet.

  4. En la máquina que no tiene acceso a Internet, haga lo siguiente (suponiendo que haya copiado los paquetes tarred a / path / to / package / en la máquina actual)

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

    y pegue el siguiente contenido dentro y guárdelo.

    [global]
    timeout = 10
    find-links = file:///path/to/package/
    no-cache-dir = true
    no-index = true
  5. Finalmente, le sugiero que use alguna forma de virtualenvinstalar los paquetes.

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

Debería poder descargar todos los módulos que están en el directorio / ruta / a / paquete / .

Nota: Solo hice esto, porque no pude agregar opciones o cambiar la forma en que instalamos los módulos. De lo contrario lo hubiera hecho

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

Para Pip 8.1.2 puede usar pip download -r requ.txtpara descargar paquetes a su máquina local.

Umut Gunebakan
fuente