MEP11: Dependencias de terceros #

Este MEP intenta mejorar la forma en que se manejan las dependencias de terceros en matplotlib.

Estado #

Completado : debe fusionarse

Sucursales y solicitudes de extracción #

#1157: Usar resolución de dependencia automática

N.° 1290: Desagregar pyparsing

#1261: Actualización seis a 1.2

Resumen #

Uno de los objetivos de matplotlib ha sido mantener su instalación lo más fácil posible. Con ese fin, se incluyen algunas dependencias de terceros en el árbol de fuentes y, en determinadas circunstancias, se instalan junto con matplotlib. Este eurodiputado tiene como objetivo resolver algunos problemas con ese enfoque, aportar algo de consistencia y continuar haciendo que la instalación sea conveniente.

En el momento en que se hizo inicialmente, setuptools , easy_install y PyPI no estaban lo suficientemente maduros como para confiar en ellos. Sin embargo, en la actualidad, deberíamos poder aprovechar de manera segura las versiones "modernas" de esas herramientas, distribuir y pip .

Si bien matplotlib tiene dependencias tanto en las bibliotecas de Python como en las bibliotecas de C/C++, este MEP aborda solo las bibliotecas de Python para no confundir el problema. Las bibliotecas C representan un conjunto de problemas más grande y en su mayoría ortogonal.

Descripción detallada #

matplotlib depende de las siguientes bibliotecas de Python de terceros:

  • entumecido

  • dateutil (Python puro)

  • pytz (Python puro)

  • seis -- requerido por dateutil (Python puro)

  • pyparsing (Python puro)

  • PIL (opcional)

  • Frameworks de GUI: pygtk, gobject, tkinter, PySide, PyQt4, wx (todos opcionales, pero se requiere uno para una GUI interactiva)

Comportamiento actual #

Al instalar desde la fuente, un git checkout o pip :

  • setup.pyintentos de . Si esto falla, la instalación falla.import numpy

  • Para cada uno de dateutil , pytz y six , setup.pyintenta importarlos (desde el espacio de nombres de nivel superior). Si eso falla, matplotlib instala su copia local de la biblioteca en el espacio de nombres de nivel superior.

  • pyparsing siempre se instala dentro del espacio de nombres matplotlib.

Este comportamiento es más sorprendente cuando se usa con pip , porque no se realiza ninguna resolución de dependencia de pip , aunque es probable que funcione para todos estos paquetes.

Según los informes, el hecho de que pyparsing esté instalado en el espacio de nombres matplotlib (# 1290) confundió a algunos usuarios al pensar que es un módulo relacionado con matplotlib e importarlo desde allí en lugar del nivel superior.

Al instalar con el instalador de Windows, dateutil , pytz y six se instalan siempre en el nivel superior , lo que podría sobrescribir las copias ya instaladas de esas bibliotecas.

TAREAS: Describir el comportamiento con el instalador de OS-X.

Al instalar usando un administrador de paquetes (Debian, RedHat, MacPorts, etc.), este comportamiento en realidad hace lo correcto, y no hay parches especiales en los paquetes de matplotlib para lidiar con el hecho de que manejamos dateutil , pytz y six de esta manera . . Sin embargo, se debe tener cuidado de que cualquier enfoque al que nos movamos continúe funcionando en ese contexto.

Mantener estos paquetes en el árbol matplotlib y asegurarse de que estén actualizados es una carga de mantenimiento. Las nuevas funciones avanzadas que pueden requerir una biblioteca de Python puro de terceros tienen una mayor barrera para la inclusión debido a esta carga.

Comportamiento deseado #

Las dependencias de terceros se descargan e instalan desde sus ubicaciones canónicas aprovechando pip , distribuir y PyPI .

dateutil , pytz y pyparsing deben convertirse en dependencias opcionales, aunque obviamente algunas características fallarían si no están instaladas. Esto permitirá al usuario decidir si quiere molestarse en instalar una función en particular.

Implementación #

Para instalar desde la fuente, y asumiendo que el usuario tiene todos los compiladores y dependencias de nivel C, esto se puede lograr con bastante facilidad usando distribuir y siguiendo las instrucciones aquí . El único cambio anticipado en el código de la biblioteca matplotlib será importar pyparsing desde el espacio de nombres de nivel superior en lugar de desde dentro de matplotlib. Tenga en cuenta que distribuir también nos permitirá eliminar la dependencia directa en seis , ya que, estrictamente hablando, solo es una dependencia directa de dateutil .

Para instalaciones binarias, hay varias alternativas (aquí ordenadas de mejor/más difícil a peor/más fácil):

  1. El instalador distutils wininst permite ejecutar un script posterior a la instalación. Podría ser posible hacer que este script ejecute pip para instalar las otras dependencias. (Vea este hilo para alguien que ha pisado ese terreno antes).

  2. Continúe enviando dateutil , pytz , six y pyparsing en nuestro instalador, pero use el script posterior a la instalación para instalarlos solo si aún no se pueden encontrar.

  3. Mueva todos estos paquetes dentro de un (nuevo) matplotlib.extern espacio de nombres para que quede claro para los usuarios externos que se trata de paquetes externos. Agregue algunas importaciones condicionales en el código base principal de matplotlib para que dateutil (en el nivel superior) se pruebe primero y, en su defecto, matplotlib.extern.dateutilse use.

2 y 3 no son deseables ya que aún requieren mantener copias de estos paquetes en nuestro árbol, y esto se ve agravado por el hecho de que se usan menos, solo en los instaladores binarios. Ninguno de estos 3 enfoques aborda Numpy, que aún tendrá que instalarse manualmente con un instalador.

TODO: ¿Cómo se relaciona esto con el instalador de Mac OS-X?

Compatibilidad con versiones anteriores #

En la actualidad, matplotlib se puede instalar desde la fuente en una máquina sin dependencias de terceros y sin conexión a Internet. Después de este cambio, se requerirá una conexión a Internet (y un PyPI que funcione) para instalar matplotlib por primera vez. (Las actualizaciones posteriores de matplotlib o el trabajo de desarrollo se ejecutarán sin acceder a la red).

Alternativas #

La distribución de huevos binarios no se siente como una solución utilizable. Eso requiere instalar primero easy_install , y los usuarios de Windows generalmente prefieren el conocido .exeo .msiinstalador que funciona de inmediato.