Sto sviluppando un plugin Python, l'obiettivo sta integrando in QGIS le funzionalità di una libreria Pyon Pyton chiamata 'elevazione'.
Esiste un modo indipendente dal sistema operativo per installare librerie Python esterne e renderle disponibili per i plugin Python?
Conosco già le diverse procedure specifiche del sistema per l'installazione di una dipendenza Python esterna, quello che mi piacerebbe fare è distribuire il mio plugin in diversi ambienti senza far impazzire la gente.
Quello che già so
Cercando sul Web e altre domande simili sembra che non ci sia una soluzione indipendente dal sistema operativo.
Utenti Windows
Python è impacchettato e distribuito all'interno del pacchetto QGIS, quindi per installare librerie Python esterne devi passare attraverso la shell OSGeo4W e usare pip da lì.
Link correlati:
- Moduli standalone e Python di QGIS
- Installazione degli strumenti di installazione di Python in OSGeo4W Python
- Come installare librerie Python di terze parti per QGIS su Windows?
Utenti OS X.
In questo caso QGIS utilizza il Python integrato che è preconfezionato all'interno di OS X e si trova in:
/usr/bin/python
Il problema qui è che il pip installato predefinito presenta alcune limitazioni e richiede troppi privilegi.
Una soluzione rapida è utilizzare home-brew per installare Python in modo che il pip possa essere eseguito su un framework Python modificabile dall'utente. Vedi i dettagli di questo approccio qui .
Dopo aver installato tutte le librerie Python tramite pip, devi solo aggiungere le loro directory alla variabile PATH.
Modo alternativo per gli utenti di OS X.
All'interno del codice Python del plugin è possibile utilizzare il pip fornito dal sistema per installare i pacchetti richiesti. Quindi è possibile rendere raggiungibile il pacchetto appena installato aggiungendolo al percorso.
import sys
import pip
pip.main(['install','--target=/Devel/test', 'elevation'])
sys.path.append("/Devel/test")
Soluzione casalinga ma funzionante (testata su Linux e OS X)
Ho deciso di optare per il modo alternativo poiché consente di mantenere l'aggiornamento e la manutenzione della libreria separati dal plug-in. Ogni volta che un nuovo utente installa il plug-in, l'ultima versione della libreria di elevazione viene scaricata e installata direttamente da pip all'interno di una sottodirectory del plug-in.
self.plugin_dir = os.path.dirname(__file__)
self.elevation_dir = os.path.join(self.plugin_dir, 'elevation')
# Checking the presence of elevation library
try:
import elevation
except:
pip.main(['install', '--target=%s' % self.elevation_dir, 'elevation'])
if self.elevation_dir not in sys.path:
sys.path.append(self.elevation_dir)