MEP11: Abhängigkeiten von Drittanbietern #

Dieses MEP versucht, die Art und Weise zu verbessern, wie Abhängigkeiten von Drittanbietern in matplotlib gehandhabt werden.

Status #

Abgeschlossen – muss zusammengeführt werden

Branches und Pull-Requests #

#1157: Automatische Abhängigkeitsauflösung verwenden

#1290: Pyparsing entbündeln

#1261: Update sechs auf 1.2

Zusammenfassung #

Eines der Ziele von matplotlib war es, die Installation so einfach wie möglich zu halten. Zu diesem Zweck werden einige Abhängigkeiten von Drittanbietern in den Quellbaum aufgenommen und unter bestimmten Umständen zusammen mit matplotlib installiert. Dieses MEP zielt darauf ab, einige Probleme mit diesem Ansatz zu lösen, etwas Einheitlichkeit zu schaffen und gleichzeitig die Installation bequemer zu gestalten.

Zu der Zeit, als dies ursprünglich geschah, waren setuptools , easy_install und PyPI nicht ausgereift genug, um sich darauf verlassen zu können. Gegenwärtig sollten wir jedoch in der Lage sein, die "modernen" Versionen dieser Tools sicher zu nutzen, zu verteilen und zu pipen .

Während matplotlib Abhängigkeiten sowohl von Python-Bibliotheken als auch von C/C++-Bibliotheken hat, behandelt dieses MEP nur die Python-Bibliotheken, um das Problem nicht zu verwirren. C-Bibliotheken repräsentieren eine größere und meist orthogonale Reihe von Problemen.

Detaillierte Beschreibung #

matplotlib hängt von den folgenden Python-Bibliotheken von Drittanbietern ab:

  • Nüppig

  • dateutil (reines Python)

  • pytz (reines Python)

  • sechs -- erforderlich von dateutil (reines Python)

  • pyparsing (reines Python)

  • PIL (optional)

  • GUI-Frameworks: pygtk, gobject, tkinter, PySide, PyQt4, wx (alle optional, aber eines ist für eine interaktive GUI erforderlich)

Aktuelles Verhalten #

Bei der Installation von der Quelle ein Git - Checkout oder Pip :

  • setup.pyVersuche zu . Wenn dies fehlschlägt, schlägt die Installation fehl.import numpy

  • Versucht für dateutil , pytz und six jeweils , setup.pysie zu importieren (aus dem Namespace der obersten Ebene). Wenn dies fehlschlägt, installiert matplotlib seine lokale Kopie der Bibliothek im Namespace der obersten Ebene.

  • pyparsing wird immer innerhalb des Matplotlib-Namespace installiert.

Dieses Verhalten ist am überraschendsten, wenn es mit pip verwendet wird, da keine Pip- Abhängigkeitsauflösung durchgeführt wird, obwohl es wahrscheinlich für alle diese Pakete funktioniert.

Die Tatsache, dass Pyparsing im matplotlib-Namespace installiert ist, hat Berichten zufolge (#1290) einige Benutzer zu der Annahme verleitet, dass es sich um ein matplotlib-bezogenes Modul handelt, und importieren es von dort und nicht von der obersten Ebene.

Bei der Installation mit dem Windows-Installationsprogramm werden dateutil , pytz und six immer auf der obersten Ebene installiert und überschreiben möglicherweise bereits installierte Kopien dieser Bibliotheken.

TODO: Beschreiben Sie das Verhalten mit dem OS-X-Installationsprogramm.

Bei der Installation über einen Paketmanager (Debian, RedHat, MacPorts usw.) macht dieses Verhalten eigentlich das Richtige, und es gibt keine speziellen Patches in den matplotlib-Paketen, die damit umgehen, dass wir dateutil , pytz und six auf diese Weise handhaben . Es sollte jedoch darauf geachtet werden, dass jeder Ansatz, zu dem wir uns bewegen, in diesem Kontext weiterhin funktioniert.

Diese Pakete im Matplotlib-Baum zu pflegen und sicherzustellen, dass sie auf dem neuesten Stand sind, ist ein Wartungsaufwand. Erweiterte neue Funktionen, die möglicherweise eine reine Python-Bibliothek eines Drittanbieters erfordern, haben aufgrund dieser Belastung eine höhere Barriere für die Aufnahme.

Gewünschtes Verhalten #

Abhängigkeiten von Drittanbietern werden von ihren kanonischen Speicherorten heruntergeladen und installiert , indem pip , distribute und PyPI genutzt werden .

dateutil , pytz und pyparsing sollten zu optionalen Abhängigkeiten gemacht werden – obwohl offensichtlich einige Funktionen fehlschlagen würden, wenn sie nicht installiert wären. Auf diese Weise kann der Benutzer entscheiden, ob er sich die Mühe machen möchte, eine bestimmte Funktion zu installieren.

Implementierung #

Für die Installation aus dem Quellcode und vorausgesetzt, der Benutzer verfügt über alle C-Level-Compiler und -Abhängigkeiten, kann dies ziemlich einfach mit der Verwendung von " distribute " und den Anweisungen hier bewerkstelligt werden . Die einzige erwartete Änderung am Code der Matplotlib-Bibliothek besteht darin, Pyparsing aus dem Namespace der obersten Ebene und nicht aus Matplotlib zu importieren. Beachten Sie, dass es uns bei distribution auch möglich ist, die direkte Abhängigkeit von six zu entfernen , da es streng genommen nur eine direkte Abhängigkeit von dateutil ist .

Für binäre Installationen gibt es eine Reihe von Alternativen (hier geordnet von am besten/schwierigsten zum schlechtesten/einfachsten):

  1. Das distutils wininst-Installationsprogramm ermöglicht die Ausführung eines Nachinstallationsskripts. Es ist möglicherweise möglich, dieses Skript dazu zu bringen, pip auszuführen , um die anderen Abhängigkeiten zu installieren. (Siehe diesen Thread für jemanden, der diesen Boden schon einmal beschritten hat).

  2. Liefern Sie weiterhin dateutil , pytz , six und pyparsing in unserem Installer aus, aber verwenden Sie das post-install-script nur, um sie zu installieren, wenn sie nicht bereits gefunden werden können.

  3. Verschieben Sie alle diese Pakete in einen (neuen) matplotlib.extern Namensraum, damit es für externe Benutzer klar ist, dass es sich um externe Pakete handelt. Fügen Sie einige bedingte Importe in der Kern-Matplotlib-Codebasis hinzu, damit dateutil (auf der obersten Ebene) zuerst versucht wird, und wenn dies fehlschlägt, matplotlib.extern.dateutilwird es verwendet.

2 und 3 sind unerwünscht, da sie weiterhin Kopien dieser Pakete in unserem Stammbaum benötigen – und dies wird durch die Tatsache verschlimmert, dass sie weniger verwendet werden – nur in den binären Installern. Keiner dieser 3 Ansätze spricht Numpy an, das immer noch manuell mit einem Installationsprogramm installiert werden muss.

TODO: In welcher Beziehung steht das zum Mac OS-X-Installationsprogramm?

Abwärtskompatibilität #

Derzeit kann matplotlib von der Quelle auf einem Computer ohne Abhängigkeiten von Drittanbietern und ohne Internetverbindung installiert werden. Nach dieser Änderung ist eine Internetverbindung (und ein funktionierendes PyPI) erforderlich, um matplotlib zum ersten Mal zu installieren. (Nachträgliche Matplotlib-Updates oder Entwicklungsarbeiten werden ohne Zugriff auf das Netzwerk ausgeführt).

Alternativen #

Das Verteilen von binären Eiern fühlt sich nicht wie eine brauchbare Lösung an. Dazu muss zuerst easy_install installiert werden, und Windows-Benutzer bevorzugen im Allgemeinen das bekannte Installationsprogramm, das sofort einsatzbereit ist..exe.msi