Ich entwickle ein Python-Plugin, dessen Ziel es ist, die Funktionen einer PyPI-Python-Bibliothek namens "elevation" in QGIS zu integrieren.
Gibt es eine betriebssystemunabhängige Möglichkeit, externe Python-Bibliotheken zu installieren und für die Python-Plugins verfügbar zu machen?
Ich kenne bereits die verschiedenen systemspezifischen Verfahren zum Installieren einer externen Python-Abhängigkeit. Ich möchte mein Plugin auf verschiedene Umgebungen verteilen, ohne dass die Leute verrückt werden.
Was ich schon weiß
Beim Durchsuchen des Webs und anderer ähnlicher Fragen scheint es keine betriebssystemunabhängige Lösung zu geben.
Windows-Benutzer
Python wird im QGIS-Paket gepackt und verteilt. Um also externe Python-Bibliotheken zu installieren, müssen Sie die OSGeo4W-Shell durchgehen und pip von dort aus verwenden.
ähnliche Links:
- QGIS Standalone- und Python-Module
- Installation von Python-Setuptools in OSGeo4W Python
- Wie installiere ich Python-Bibliotheken von Drittanbietern für QGIS unter Windows?
OS X-Benutzer
In diesem Fall verwendet QGIS das in OS X vorinstallierte Python, das sich unter folgender Adresse befindet:
/usr/bin/python
Das Problem hierbei ist, dass der standardmäßig installierte Pip einige Einschränkungen aufweist und zu viele Berechtigungen erfordert.
Eine schnelle Problemumgehung besteht darin, Python mithilfe von Home-Brew zu installieren, damit Ihr Pip auf einem vom Benutzer veränderbaren Python-Framework ausgeführt werden kann. Einzelheiten zu diesem Ansatz finden Sie hier .
Nachdem Sie alle Python-Bibliotheken über pip installiert haben, müssen Sie nur ihre Verzeichnisse zur PATH-Variablen hinzufügen.
Alternative Möglichkeit für OS X-Benutzer
Innerhalb des Plugin-Python-Codes können Sie den vom System bereitgestellten Pip verwenden, um die erforderlichen Pakete zu installieren. Dann können Sie das gerade installierte Paket erreichbar machen und es dem Pfad hinzufügen.
import sys
import pip
pip.main(['install','--target=/Devel/test', 'elevation'])
sys.path.append("/Devel/test")
Selbstgemachte, aber funktionierende Lösung (sowohl unter Linux als auch unter OS X getestet)
Ich habe mich für den alternativen Weg entschieden, da dadurch die Aktualisierung und Wartung der Bibliothek vom Plugin getrennt bleiben kann. Jedes Mal, wenn ein neuer Benutzer das Plugin installiert, wird die neueste Version der Elevation-Bibliothek direkt heruntergeladen und von pip in einem Unterverzeichnis des Plugins installiert.
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)