MEP11: Dipendenze di terze parti #
Questo MEP tenta di migliorare il modo in cui vengono gestite le dipendenze di terze parti in matplotlib.
Stato n.
Completato : deve essere unito
Filiali e Pull request #
#1157: Utilizza la risoluzione automatica delle dipendenze
#1290: Debundling pyparsing
#1261: Aggiornamento sei alla 1.2
Estratto n.
Uno degli obiettivi di matplotlib è stato quello di mantenerlo il più semplice possibile da installare. A tal fine, alcune dipendenze di terze parti sono incluse nell'albero dei sorgenti e, in determinate circostanze, installate insieme a matplotlib. Questo MEP mira a risolvere alcuni problemi con questo approccio, portare un po' di coerenza, pur continuando a rendere conveniente l'installazione.
Al momento iniziale, setuptools , easy_install e PyPI non erano abbastanza maturi per poter fare affidamento. Tuttavia, al momento, dovremmo essere in grado di sfruttare in sicurezza le versioni "moderne" di questi strumenti, deploy e pip .
Sebbene matplotlib abbia dipendenze sia dalle librerie Python che dalle librerie C/C++, questo MEP si rivolge solo alle librerie Python in modo da non confondere il problema. Le librerie C rappresentano un insieme di problemi più ampio e per lo più ortogonale.
Descrizione dettagliata #
matplotlib dipende dalle seguenti librerie Python di terze parti:
Numpy
dateutil (puro Python)
pytz (pitone puro)
six -- richiesto da dateutil (puro Python)
pyparsing (puro Python)
PIL (facoltativo)
Framework GUI: pygtk, gobject, tkinter, PySide, PyQt4, wx (tutti opzionali, ma uno è richiesto per una GUI interattiva)
Comportamento attuale #
Durante l'installazione dal sorgente, un git checkout o pip :
setup.py
tentativi di . Se ciò non riesce, l'installazione non riesce.import numpy
Per ognuno di dateutil , pytz e six ,
setup.py
tenta di importarli (dallo spazio dei nomi di primo livello). Se fallisce, matplotlib installa la sua copia locale della libreria nello spazio dei nomi di primo livello.pyparsing è sempre installato all'interno dello spazio dei nomi matplotlib.
Questo comportamento è molto sorprendente se usato con pip , perché non viene eseguita alcuna risoluzione della dipendenza pip , anche se è probabile che funzioni per tutti questi pacchetti.
Secondo quanto riferito (#1290), il fatto che pyparsing sia installato nello spazio dei nomi matplotlib ha confuso alcuni utenti nel pensare che si tratti di un modulo relativo a matplotlib e di importarlo da lì piuttosto che dal livello superiore.
Quando si esegue l'installazione utilizzando il programma di installazione di Windows, dateutil , pytz e six vengono installati al livello superiore always , sovrascrivendo potenzialmente le copie già installate di tali librerie.
TODO: Descrivi il comportamento con il programma di installazione di OS-X.
Quando si installa utilizzando un gestore di pacchetti (Debian, RedHat, MacPorts ecc.), questo comportamento in realtà fa la cosa giusta e non ci sono patch speciali nei pacchetti matplotlib per far fronte al fatto che gestiamo dateutil , pytz e six in questo modo . Tuttavia, occorre prestare attenzione affinché qualunque approccio adottiamo continui a funzionare in quel contesto.
Mantenere questi pacchetti nell'albero matplotlib e assicurarsi che siano aggiornati è un onere di manutenzione. Le nuove funzionalità avanzate che potrebbero richiedere una libreria Python pura di terze parti hanno una maggiore barriera all'inclusione a causa di questo onere.
Comportamento desiderato #
Le dipendenze di terze parti vengono scaricate e installate dalle loro posizioni canoniche sfruttando pip , deploy e PyPI .
dateutil , pytz e pyparsing dovrebbero essere trasformati in dipendenze opzionali, anche se ovviamente alcune funzionalità fallirebbero se non fossero installate. Ciò consentirà all'utente di decidere se desidera preoccuparsi di installare una particolare funzionalità.
Implementazione n.
Per l'installazione dal sorgente, e supponendo che l'utente disponga di tutti i compilatori e le dipendenze di livello C, ciò può essere realizzato abbastanza facilmente usando distribuisci e seguendo le istruzioni qui . L'unica modifica anticipata al codice della libreria matplotlib sarà l'importazione di pyparsing dallo spazio dei nomi di livello superiore anziché dall'interno di matplotlib. Si noti che la distribuzione ci consentirà anche di rimuovere la dipendenza diretta da six , poiché è, in senso stretto, solo una dipendenza diretta di dateutil .
Per le installazioni binarie, ci sono una serie di alternative (qui ordinate dalla migliore/più difficile alla peggiore/più semplice):
Il programma di installazione distutils wininst consente l'esecuzione di uno script post-installazione. Potrebbe essere possibile ottenere questo script per eseguire pip per installare le altre dipendenze. (Vedi questo thread per qualcuno che ha calcato quel terreno prima).
Continua a spedire dateutil , pytz , six e pyparsing nel nostro programma di installazione, ma usa lo script post-install per installarli solo se non sono già stati trovati.
Sposta tutti questi pacchetti all'interno di un (nuovo)
matplotlib.extern
spazio dei nomi in modo che sia chiaro per gli utenti esterni che si tratta di pacchetti esterni. Aggiungi alcune importazioni condizionali nella base di codice matplotlib principale in modo che dateutil (al livello più alto) venga provato per primo e, in caso contrario,matplotlib.extern.dateutil
viene utilizzato.
2 e 3 sono indesiderabili in quanto richiedono ancora il mantenimento di copie di questi pacchetti nel nostro albero - e questo è esacerbato dal fatto che sono usati meno - solo negli installatori binari. Nessuno di questi 3 approcci affronta Numpy, che dovrà comunque essere installato manualmente utilizzando un programma di installazione.
TODO: In che modo questo si collega al programma di installazione di Mac OS-X?
Compatibilità con le versioni precedenti #
Al momento, matplotlib può essere installato dal sorgente su una macchina senza dipendenze di terze parti e senza una connessione Internet. Dopo questa modifica, sarà necessaria una connessione Internet (e un PyPI funzionante) per installare matplotlib per la prima volta. (Gli aggiornamenti successivi di matplotlib o il lavoro di sviluppo verranno eseguiti senza accedere alla rete).
Alternative #
La distribuzione di uova binarie non sembra una soluzione utilizzabile. Ciò richiede l' installazione iniziale di easy_install e gli utenti Windows generalmente preferiscono il noto programma .exe
di .msi
installazione che funziona immediatamente.