Je développe un plugin Python, la cible intègre dans QGIS les fonctionnalités d'une bibliothèque PyPI Python appelée 'élévation'.
Existe-t-il un moyen indépendant du système d'exploitation d'installer des bibliothèques Python externes et de les rendre disponibles pour les plugins Python?
Je connais déjà les différentes procédures spécifiques au système pour installer une dépendance Python externe, ce que j'aimerais faire est de distribuer mon plugin dans différents environnements sans rendre les gens fous.
Ce que je sais déjà
En recherchant sur le Web et d'autres questions similaires, il semble qu'il n'y ait pas de solution indépendante du système d'exploitation.
Utilisateurs Windows
Python est empaqueté et distribué à l'intérieur du package QGIS, donc pour installer des bibliothèques Python externes, vous devez passer par le shell OSGeo4W et utiliser pip à partir de là.
Liens connexes:
- Modules autonomes QGIS et Python
- Installation de setuptools Python dans OSGeo4W Python
- Comment installer des bibliothèques python tierces pour QGIS sous Windows?
Utilisateurs d'OS X
Dans ce cas, QGIS utilise le Python intégré qui est préemballé dans OS X et situé à:
/usr/bin/python
Le problème ici est que le pip installé par défaut a certaines limitations et nécessite trop de privilèges.
Une solution rapide consiste à utiliser home-brew pour installer Python afin que votre pip puisse s'exécuter sur un framework Python modifiable par l'utilisateur. Voir les détails de cette approche ici .
Après avoir installé toutes les bibliothèques Python via pip, il vous suffit d'ajouter leurs répertoires à la variable PATH.
Autre moyen pour les utilisateurs d'OS X
A l'intérieur du plugin Python, vous pouvez utiliser le pip fourni par le système pour installer les packages requis. Ensuite, vous pouvez rendre le package juste installé accessible en l'ajoutant au chemin.
import sys
import pip
pip.main(['install','--target=/Devel/test', 'elevation'])
sys.path.append("/Devel/test")
Solution maison mais fonctionnelle (testée sur Linux et OS X)
J'ai décidé d'opter pour l'alternative car elle permet de garder la mise à jour et la maintenance de la bibliothèque séparées du plugin. Chaque fois qu'un nouvel utilisateur installe le plugin, la dernière version de la bibliothèque d'élévation est directement téléchargée et installée par pip dans un sous-répertoire du plugin.
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)