En el archivo de requisitos setup.py o pip, ¿cómo controlar el orden de instalación de las dependencias del paquete?

Tengo un paquete de Python con su setup.py con las dependencias declaradas de la manera habitual, en install_requires = […]. Uno de los paquetes allí, scikits.timeseries, tiene un setup.py que espera que ya se haya instalado numpy, por lo tanto, me gustaría alguna forma de tener primero instalado numpy. Para este caso y en general, ¿se puede controlar el orden de instalación de dependencia? ¿Cómo?

Actualmente, el orden en el que setup.py elimina las dependencias (como se indica en el argumento install_requires) parece prácticamente aleatorio. Además, en la configuración setup.py (…) intenté usar el argumento:

extras_require={'scikits.timeseries': ['numpy']} 

… sin éxito, el orden de instalación de las dependencias no se vio afectado.

También intenté configurar un archivo de requisitos de pip, pero también el orden de instalación de las dependencias de pip no coincidía con el orden de línea del archivo de requisitos, por lo que no hubo suerte.

Otra posibilidad sería tener una llamada al sistema cerca de la parte superior de setup.py, para instalar numpy antes de la llamada de configuración (…), pero espero que haya una mejor manera. Gracias de antemano por cualquier ayuda.

Si scikits.timeseries necesita numpy , debe declararlo como una dependencia. Si lo hiciera, entonces pip manejaría las cosas por ti (estoy bastante seguro de que setuptools haría, pero no lo he usado en mucho tiempo). Si controla scikits.timeseries , entonces debería arreglar sus declaraciones de dependencia.

Puedes agregar numpy a la sección setup_requires:

 setup_requires=['numpy'], 

Use el parámetro setup_requires , por ejemplo, para instalar numpy anterior y __builtins__.__NUMPY_SETUP__ = False gancho para que Numpy se instale correctamente:

 setup( name='test', version='0.1', setup_requires=['numpy'], install_requires=['scipy'] ) def run(self): __builtins__.__NUMPY_SETUP__ = False import numpy 

Aquí hay una solución que realmente funciona. No es un método demasiado “agradable” para tener que recurrir, sino “tiempos desesperados …”.

Básicamente, tienes que:

  • Reemplace la clase setuptools “comando de instalación” (más los análogos estrechamente relacionados)
  • Ejecute pip desde el script a través de las instrucciones de la línea de comandos para las cuales puede hacer cumplir la orden

Los inconvenientes de esto son:

  • La pipa debe estar instalada. No se puede ejecutar setup.py en un entorno sin eso.
  • La salida de la consola de las instalaciones iniciales de “requisitos previos” no aparece por alguna extraña razón. (Quizás publicaré una actualización aquí abajo, arreglando eso …)

El código:

 from setuptools import setup # Override standard setuptools commands. # Enforce the order of dependency installation. #------------------------------------------------- PREREQS = [ "ORDERED-INSTALL-PACKAGE" ] from setuptools.command.install import install from setuptools.command.develop import develop from setuptools.command.egg_info import egg_info def requires( packages ): from os import system from sys import executable as PYTHON_PATH from pkg_resources import require require( "pip" ) CMD_TMPLT = '"' + PYTHON_PATH + '" -m pip install %s' for pkg in packages: system( CMD_TMPLT % (pkg,) ) class OrderedInstall( install ): def run( self ): requires( PREREQS ) install.run( self ) class OrderedDevelop( develop ): def run( self ): requires( PREREQS ) develop.run( self ) class OrderedEggInfo( egg_info ): def run( self ): requires( PREREQS ) egg_info.run( self ) CMD_CLASSES = { "install" : OrderedInstall , "develop" : OrderedDevelop , "egg_info": OrderedEggInfo } #------------------------------------------------- setup ( ... install_requires = [ "UNORDERED-INSTALL-PACKAGE" ], cmdclass = CMD_CLASSES )