¿Cómo instalar paquetes de Python con todas las dependencias sin conexión a través de pip3?

¿Cómo instalar paquetes de Python con todas las dependencias sin conexión a través de pip3?

En primer lugar, logré instalar Ansible en un servidor que no tiene acceso a Internet. Pero me pregunto si mi enfoque es correcto.

Al principio descargué las dependencias necesarias a través de pip3.

pip3 download ansible -d .

Esto resultó en la descarga de los siguientes archivos:

ansible-2.9.4.tar.gz                          
cryptography-2.8-cp34-abi3-manylinux1_x86_64.whl  
MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl  
PyYAML-5.3.tar.gz
cffi-1.13.2-cp36-cp36m-manylinux1_x86_64.whl  
Jinja2-2.11.1-py2.py3-none-any.whl                
pycparser-2.19.tar.gz                              
six-1.14.0-py2.py3-none-any.whl

Ahora que hice que estos archivos estuvieran disponibles en mi computadora remota, intenté usar

pip3 install ansible-2.9.4.tar.gz

para instalar ansible.

Esto resultó en el siguiente error:

Processing ./ansible-2.9.4.tar.gz
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 
'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 
0x7f00726f9ef0>: Failed to establish a new connection: [Errno -2] Name or service not known',)': /simple/jinja2/

Entonces intenté instalar Jinja2 manualmente:

pip3 install jinja2-2.11.1-py2.py3-none-any.whl

Pero esto tampoco funcionó:

WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection
 broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 
0x7fd303a23940>: Failed to establish a new connection: [Errno -2] Name or service not known',)': 
/simple/markupsafe/

Después de instalar Markupsafe, también se pudo instalar Jinja2. Al final pip3 install ansible-2.9.4.tar.gzinstalé ansible con éxito.

Ahora mi pregunta es. ¿Hay alguna manera de indicar pipque se deben usar los archivos descargados para instalar las dependencias o existe un método más sencillo para instalar un paquete de Python específico con todas sus dependencias sin conexión?

Gracias por tu ayuda y un saludo. yabberth

Respuesta1

¿Hay alguna manera de indicar pipque se deben usar los archivos descargados para instalar las dependencias o existe un método más sencillo para instalar un paquete de Python específico con todas sus dependencias sin conexión?

Creo que lo que estás buscando es el--sin índicey--buscar enlacesopciones para pip install. Según la pip installdocumentación oficial de opciones:

--sin índice

Ignore el índice del paquete (en su lugar, solo mire las URL de --find-links).

-f, --buscar enlaces

Si es una URL o una ruta a un archivo html, busque enlaces a archivos. Si una ruta local o una URL file:// es un directorio, busque archivos en la lista del directorio.

Con estas opciones puedes hacer ex. instalación local:

pip3 install --no-index --find-links /some/path <package name>

o instalación remota (por ejemplo, a través de HTTP):

pip3 install --no-index --find-links http:\\remotes\server <package name>

En su caso, debería poder usar simplemente ansiblepara el nombre del paquete, por ejemplo:

pip3 install --no-index --find-links /some/path ansible

pip3 install --no-index --find-links http:\\remotes\server ansible

Aunque se puede utilizar el nombre completo del archivo si lo desea:

pip3 install --no-index --find-links /some/path ansible-2.9.4.tar.gz

pip3 install --no-index --find-links http:\\remotes\server ansible-2.9.4.tar.gz

Suponiendo que todas las dependencias requeridas residen en la misma ubicación (como se enumera en su pregunta original), deben instalarse normalmente (es decir, sin tener que instalar cada dependencia en orden manualmente).


Requisitos

Otra opción podría ser crear un archivo de requisitos con el orden de instalación de dependencias adecuado, por ejemplo:

ex. requisitos.txt

/path/to/MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl 
/path/to/Jinja2-2.11.1-py2.py3-none-any.whl 
/path/to/ansible-2.9.4.tar.gz
# ...                          

Luego use, por ejemplo, pip3 install -r requirements.txtpara instalar los paquetes enumerados. También podrías usar, por ejemplo, enlaces HTTP nuevamente:

ex. requisitos.txt

http:\\remotes\server\MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl 
http:\\remotes\server\Jinja2-2.11.1-py2.py3-none-any.whl 
http:\\remotes\server\ansible-2.9.4.tar.gz
# ... 

El claro inconveniente aquí es que, suponiendo que un paquete depende de otro, ya necesita saber el orden en el que deben instalarse ciertos paquetes.


Otras opciones de URL

Quizás también quieras mirar elsección del sistema de control de versiones (VCS)de pip installdocumentación, que ofrece ejemplos de combinación pip installcon enlaces VCS (es decir, Git, Mercurial, Subversion y Bazaar).


Referencias

instalación de pipas

instalación de pip (opciones)

Respuesta2

Dado que lo que necesita no es tener un espejo completo, sugeriría usarpython-pypi-espejo:

1- Instale python-pypi-mirror usando pip en un servidor que tenga conexión a Internet.

2- Instale el módulo Python http.server en este servidor.

3- Cree un directorio que servirá sus paquetes pip.

4- Descargue los paquetes necesarios usando python-pypi-mirror al directorio creado recientemente y expuesto como servidor http (contendrá todas sus dependencias).

5- Instale el paquete necesario de forma remota.

 pip3 install --trusted-host <http_server> -i http://<http_server>:<http.server_default_port>/simple <package_name>

Encontrarás todas las instrucciones necesarias aquí.

información relacionada