2012-06-18 17 views
82

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

+1

Relacionados: [¿Cómo instalar paquetes de pip según requirements.txt desde un directorio local?] (http://stackoverflow.com/q/7225900/95735) –

Respuesta

42

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

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

Algunos paquetes pueden tener que ser archivados 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.py tendrá install_requires lista que menciona una o más cosas que usted tiene en su directorio /pypi. De este modo:

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

Si usted quiere ser capaz de ejecutar su aplicación con todas las dependencias necesarias al tiempo que la piratería en él, que va a hacer algo como esto:

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

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

Si desea instalar su aplicación y sus dependencias en el medio ambiente pitón actual, que va a hacer algo como esto:

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

En ambos casos, la construcción fallará si una o más dependencias aren' t presente en el directorio /pypi. No intentará instalar de manera promiscua cosas que faltan de Internet.

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

Si la máquina que usted ha construido su aplicación tiene misma arquitectura que la máquina en la que desea implementar, puede simplemente tarball todo el directorio del entorno virtual en el que easy_install -Ed 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 necesita tener instalada la misma versión de Python, y también cualquier dependencia basada en C que su aplicación pueda tener preinstalada allí (por ejemplo, si depende de PIL, entonces libpng, libjpeg, etc. pre instalado).

+2

En lugar de '--allow-hosts = None' puede usar el interruptor' --no-index' – romor

+0

¿Puede explicar cómo crear una aplicación Python correctamente formada? –

+2

@PrabhjotRai consulte el problema https://packaging.python.org/distributing/ –

4

Descargue el tarball, transfiéralo a su máquina FreeBSD y extráigalo, luego ejecute python setup.py install y ¡listo!

EDITAR: Solo para agregarlo, también puede instalar los archivos tar con pip ahora.

+1

¿Qué hay de todas las dependencias? ¿Cuál es la mejor manera de resolverlos? ¿Debo instalar las dependencias manualmente también? –

+0

Sí, desafortunadamente es la única forma que conozco. – dav1d

157

Utilizo la opción -d (o --download) en pip install, lo que hace que el proceso de descarga de archivos sdist de PyPI sea mucho más simple.Por ejemplo, pip install --download /path/to/some/dir celery descargará los tarballs sdist para el apio y todas sus dependencias al /path/to/some/dir (pero no los instalará). Luego puede usar pip install --no-index --find-links /path/to/some/dir/ celery para instalar apio usando los archivos descargados, sin tener que acceder a la red.

El mismo proceso funciona si se reemplaza celery en ambos comandos con -r requirements.txt, donde requirements.txt es un archivo requerimientos listado PIP todos los paquetes que desee (y opcionalmente las versiones que desee).

ACTUALIZACIÓN

Deprecation: pip instalación --download ha quedado obsoleto y será eliminado en el futuro. Pip ahora tiene un comando download que debería ser usado en su lugar.

El comando es la siguiente:
pip download -r requirements.txt

Para python3:
pip3 download -r requirements.txt

+0

con esto es que las dependencias pueden tener otras dependencias y no se descargarán. – vikki

+0

[Cesta de serpientes] (https://github.com/prezi/snakebasket) (construida en la parte superior de pip) también descargará las dependencias de las dependencias. – vikki

+4

@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 canasta de serpientes puede hacer otras cosas útiles (nunca la usó), pero definitivamente no es necesaria por esa razón. –

2

para Pip 8.1.2 se puede utilizar pip download -r requ.txt descargar paquetes en el equipo local.

2

python fuera de línea. para hacer esto yo uso virtualenv (aislado ambiente Python)

1) instalar virtualenv en línea con pip:

pip install virtualenv --user 

o fuera de línea con whl: ir a este link, descarga última versión (.whl o alquitrán. GZ) e instalar que con este comando:

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

utilizando --user que no es necesario utilizar sudo pip….

2) utilizar virtualenv

en la máquina en línea seleccionar un directorio con el terminal cd y ejecutar este código:

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

después de instalar todos los paquetes, lo que tiene que generar un requirements.txt así que mientras su virtualenv es activa, escribir

pip freeze > requirements.txt 

abrir una nueva terminal y crear otro env como myenv2.

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

Ahora puede ir a la carpeta fuera de línea donde su carpeta requirements.txt y tranferred_packages están ahí. descargue los paquetes con el siguiente código y colóquelos todos en la carpeta tranferred_packages.

pip download -r requirements.txt 

tomar su carpeta sin conexión a la computadora sin conexión 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 sin conexión [requirements.txt, tranferred_packages {matraz de 0.10.1.tar.gz, ...} ] lista

cheque de su paquete

pip list 

nota: ya que estamos en el año 2017 que es mejor utilizar Python 3. yo Puedes crear python 3 virtualenv con este comando.

virtualenv -p python3 envname 
+0

Parece que faltan algunos pasos u "se ofuscaron" 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

+0

tal vez, pero debería considerar 'quería una breve publicación', 'ese proceso fue complejo y no pude escribir cada paso (eso solo es posible en YouTube)'. – cyera

2

Utilizando wheel paquetes compilados.

paquete hasta:

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

copia tar 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/* 

Nota wheel paquetes binarios no están al otro lado máquinas.

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

+1

Tuve problemas para agruparme en la máquina con Python 3.6 y extraer en otra con Python 3.5: "_ .whl no es una rueda admitida en esta plataforma_". Las versiones de origen y destino pueden ser necesarias para coincidir con algunos paquetes. –

Cuestiones relacionadas