Rueda de comstackción para un paquete (como scipy) sin statement de dependencia

Creo que no hay diferencia aquí, pero estoy usando Python 2.7.

Entonces, la parte general de mi pregunta es la siguiente: uso un virtualenv separado para cada uno de mis proyectos. No tengo acceso de administrador y de todos modos no quiero meterme con los paquetes instalados en el sistema. Naturalmente, quiero usar ruedas para acelerar las actualizaciones de paquetes e instalaciones en los virtualenv . ¿Cómo puedo construir una rueda cuyas dependencias solo se cumplen dentro de un virtualenv específico?

Concretamente, la emisión.

 pip wheel -w $WHEELHOUSE scipy 

falla con

 Building wheels for collected packages: scipy Running setup.py bdist_wheel for scipy Destination directory: /home/moritz/.pip/wheelhouse Complete output from command /home/moritz/.virtualenvs/base/bin/python -c "import setuptools;__file__='/home/moritz/.virtualenvs/base/build/scipy/setup.py';exec(compile(open(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" bdist_wheel -d /home/moritz/.pip/wheelhouse: Traceback (most recent call last): File "", line 1, in  File "/home/moritz/.virtualenvs/base/build/scipy/setup.py", line 237, in  setup_package() File "/home/moritz/.virtualenvs/base/build/scipy/setup.py", line 225, in setup_package from numpy.distutils.core import setup ImportError: No module named numpy.distutils.core ---------------------------------------- Failed building wheel for scipy Failed to build scipy Cleaning up... 

Debido a que numpy no está presente globalmente y mientras se construye la rueda funciona cuando un virtualenv con numpy instalado está activo, parece una terrible idea que la rueda dependa de la versión específica de virtualenv de numpy .

pandas que también depende de numpy parece instalar sus propios componentes de numpy pero no estoy seguro de que esa sea la mejor solución.

Pude instalar numpy con --user y usar eso para construir la rueda scipy . ¿Hay mejores opciones?

Descripción del problema

  • Tener un paquete de Python (como scipy ), que depende de otros paquetes (como numpy ) pero setup.py no está declarando ese requisito / dependencia.
  • La construcción de una rueda para dicho paquete tendrá éxito en caso de que el entorno actual proporcione los paquetes que se necesitan.
  • En caso de que los paquetes requeridos no estén disponibles, la construcción de una rueda fallará.

Nota: la solución ideal es corregir el setup.py roto agregando allí la statement del paquete requerido. Pero esto en su mayoría no es factible y tenemos que ir de otra manera.

Solución: Instale los paquetes requeridos primero

El procedimiento (para instalar scipy que requiere numpy ) tiene dos pasos

  1. construir las ruedas
  2. Utiliza las ruedas para instalar el paquete que necesitas.

Llene la timonera con las ruedas que necesite.

Esto debe hacerse solo una vez y luego puede reutilizarse muchas veces.

  1. ha configurado correctamente la configuración de pip para que se permita la instalación desde las ruedas, se configura el directorio de la timonera y se superpone con download-cache y find-links como se muestra en el siguiente ejemplo de pip.conf :

     [global] download-cache = /home/javl/.pip/cache find-links = /home/javl/.pip/packages [install] use-wheel = yes [wheel] wheel-dir = /home/javl/.pip/packages 
  2. Instale todas las bibliotecas de sistema necesarias para todos los paquetes, que deben comstackrse

  3. construir una rueda para el paquete requerido ( numpy )

     $ pip wheel numpy 
  4. configure virtualenv (solo se necesita una vez), numpy e instale allí numpy :

     $ pip install numpy 

    Como una rueda está lista, será rápida.

  5. construir una rueda para scipy (aún estando en el virtualenv)

     $ pip wheel scipy 

    A estas alturas, tendrá su caseta con las ruedas que necesita.

  6. Puedes eliminar el virtualenv temporal, ya no es necesario.

Instalando en virtualenv nuevo

Supongo que usted ha creado virtualenv nuevo, lo ha activado y desea tener instalado scipy allí.

La instalación de scipy desde la nueva rueda scipy directamente aún fallaría en la pérdida de numpy . Esto lo superamos instalando primero numpy .

 $ pip install numpy 

Y luego terminar con scipy.

 $ pip install scipy 

Supongo que esto se podría hacer en una llamada (pero no lo probé)

 $ pip install numpy scipy 

Instalando repetidamente scipy de versión probada

Es probable que en algún momento en el futuro se lance un nuevo lanzamiento de scipy o numpy y pip intentará instalar la última versión para la cual no haya ninguna rueda en su timonera.

Si puede vivir con las versiones que ha usado hasta ahora, deberá crear numpy indicando las versiones de numpy y scipy desee e instalar desde allí.

Esto asegurará que el paquete necesario esté presente antes de que realmente se use.