MEP11 : Dépendances tierces #

Ce MEP tente d'améliorer la manière dont les dépendances tierces dans matplotlib sont gérées.

Statut #

Terminé -- doit être fusionné

Branches et demandes d'extraction #

#1157 : Utiliser la résolution automatique des dépendances

#1290 : Dégrouper le pyparsing

#1261 : Mise à jour six vers 1.2

Résumé #

L'un des objectifs de matplotlib a été de le garder aussi facile à installer que possible. À cette fin, certaines dépendances tierces sont incluses dans l'arborescence des sources et, dans certaines circonstances, installées avec matplotlib. Ce MEP vise à résoudre certains problèmes avec cette approche, apporter une certaine cohérence, tout en continuant à rendre l'installation pratique.

Au moment où cela a été fait initialement, setuptools , easy_install et PyPI n'étaient pas assez matures pour être fiables. Cependant, à l'heure actuelle, nous devrions pouvoir exploiter en toute sécurité les versions "modernes" de ces outils, distribuer et pip .

Alors que matplotlib a des dépendances à la fois sur les bibliothèques Python et les bibliothèques C/C++, ce MEP ne traite que les bibliothèques Python afin de ne pas confondre le problème. Les bibliothèques C représentent un ensemble de problèmes plus vaste et principalement orthogonal.

Descriptif détaillé #

matplotlib dépend des bibliothèques Python tierces suivantes :

  • Numpy

  • dateutil (Python pur)

  • pytz (python pur)

  • six -- requis par dateutil (Python pur)

  • pyparsing (Python pur)

  • PIL (optionnel)

  • Frameworks GUI : pygtk, gobject, tkinter, PySide, PyQt4, wx (tous facultatifs, mais un est requis pour une interface graphique interactive)

Comportement actuel #

Lors de l'installation depuis la source, un git checkout ou pip :

  • setup.pytente de . Si cela échoue, l'installation échoue.import numpy

  • Pour chacun des dateutil , pytz et six , setup.pytente de les importer (depuis l'espace de noms de niveau supérieur). Si cela échoue, matplotlib installe sa copie locale de la bibliothèque dans l'espace de noms de niveau supérieur.

  • pyparsing est toujours installé à l'intérieur de l'espace de noms matplotlib.

Ce comportement est le plus surprenant lorsqu'il est utilisé avec pip , car aucune résolution de dépendance pip n'est effectuée, même s'il est susceptible de fonctionner pour tous ces packages.

Le fait que pyparsing soit installé dans l'espace de noms matplotlib aurait (#1290) confondu certains utilisateurs en leur faisant croire qu'il s'agit d'un module lié à matplotlib et l'importer à partir de là plutôt qu'au niveau supérieur.

Lors de l'installation à l'aide du programme d'installation de Windows, dateutil , pytz et six sont toujours installés au niveau supérieur , écrasant potentiellement les copies déjà installées de ces bibliothèques.

À FAIRE : Décrivez le comportement avec le programme d'installation d'OS-X.

Lors de l'installation à l'aide d'un gestionnaire de packages (Debian, RedHat, MacPorts, etc.), ce comportement fait en fait la bonne chose, et il n'y a pas de correctifs spéciaux dans les packages matplotlib pour gérer le fait que nous gérons dateutil , pytz et six de cette manière . Cependant, il faut veiller à ce que, quelle que soit l'approche adoptée, elle continue de fonctionner dans ce contexte.

Maintenir ces packages dans l'arborescence matplotlib et s'assurer qu'ils sont à jour est un fardeau de maintenance. Les nouvelles fonctionnalités avancées qui peuvent nécessiter une bibliothèque Python pure tierce ont un obstacle plus élevé à l'inclusion en raison de cette charge.

Comportement souhaité #

Les dépendances tierces sont téléchargées et installées à partir de leurs emplacements canoniques en exploitant pip , distribuer et PyPI .

dateutil , pytz et pyparsing doivent être transformés en dépendances facultatives - bien que certaines fonctionnalités échouent évidemment si elles ne sont pas installées. Cela permettra à l'utilisateur de décider s'il souhaite installer une fonctionnalité particulière.

Mise en œuvre #

Pour l'installation à partir des sources, et en supposant que l'utilisateur dispose de tous les compilateurs et dépendances de niveau C, cela peut être accompli assez facilement en utilisant distribuer et en suivant les instructions ici . La seule modification prévue du code de la bibliothèque matplotlib consistera à importer pyparsing à partir de l'espace de noms de niveau supérieur plutôt qu'à partir de matplotlib. Notez que distribuer nous permettra également de supprimer la dépendance directe sur six , puisqu'il ne s'agit, à proprement parler, que d'une dépendance directe de dateutil .

Pour les installations binaires, il existe un certain nombre d'alternatives (ici classées du meilleur/le plus difficile au pire/le plus facile) :

  1. Le programme d'installation distutils wininst permet à un script de post-installation de s'exécuter. Il est possible que ce script exécute pip pour installer les autres dépendances. (Voir ce fil pour quelqu'un qui a déjà foulé ce terrain).

  2. Continuez à expédier dateutil , pytz , six et pyparsing dans notre programme d'installation, mais utilisez le script de post-installation pour les installer uniquement s'ils ne peuvent pas déjà être trouvés.

  3. Déplacez tous ces packages dans un (nouvel) matplotlib.extern espace de noms afin qu'il soit clair pour les utilisateurs externes qu'il s'agit de packages externes. Ajoutez des importations conditionnelles dans la base de code principale de matplotlib afin que dateutil (au niveau supérieur) soit essayé en premier, et qu'il matplotlib.extern.dateutilsoit utilisé à défaut.

2 et 3 ne sont pas souhaitables car ils nécessitent toujours de conserver des copies de ces packages dans notre arborescence - et cela est exacerbé par le fait qu'ils sont moins utilisés - uniquement dans les installateurs binaires. Aucune de ces 3 approches ne concerne Numpy, qui devra toujours être installé manuellement à l'aide d'un installateur.

TODO : Quel est le lien avec le programme d'installation de Mac OS-X ?

Rétrocompatibilité #

À l'heure actuelle, matplotlib peut être installé à partir de la source sur une machine sans les dépendances tierces et sans connexion Internet. Après ce changement, une connexion Internet (et un PyPI fonctionnel) sera nécessaire pour installer matplotlib pour la première fois. (Les mises à jour ultérieures de matplotlib ou les travaux de développement s'exécuteront sans accéder au réseau).

Alternatives #

Distribuer des œufs binaires ne semble pas être une solution utilisable. Cela nécessite d' abord d'installer easy_install , et les utilisateurs de Windows préfèrent généralement le programme d'installation .exeou le programme d' .msiinstallation bien connu qui fonctionne prêt à l'emploi.