Estoy desarrollando un plugin de Python, el objetivo es integrar en QGIS las funcionalidades de una librería PyPI de Python llamada 'elevation'.
¿Existe una forma independiente del sistema operativo de instalar bibliotecas externas de Python y hacerlas disponibles para los plugins de Python?
Ya conozco los diferentes procedimientos específicos del sistema para instalar una dependencia externa de Python, lo que me gustaría es distribuir mi plugin en diferentes entornos sin que la gente se vuelva loca.
Lo que ya sé
Buscando en la web y en otras preguntas similares parece que no hay una solución independiente del sistema operativo.
Usuarios de Windows
Python está empaquetado y distribuido dentro del paquete de QGIS, por lo que para instalar librerías externas de Python hay que pasar por el Shell de OSGeo4W y usar pip desde allí.
enlaces relacionados:
- Módulos independientes de QGIS y Python
- Instalación de setuptools de Python en OSGeo4W Python
- ¿Cómo instalar bibliotecas python de terceros para QGIS en Windows?
Usuarios de OS X
En este caso QGIS utiliza el Python incorporado que está preempacado dentro de OS X y que se encuentra en:
/usr/bin/python
El problema aquí es que el pip instalado por defecto tiene algunas limitaciones y requiere demasiados privilegios.
Una solución rápida es utilizar home-brew para instalar Python de manera que su pip pueda ejecutarse contra un framework Python modificable por el usuario. Vea los detalles de este enfoque aquí .
Después de instalar todas las bibliotecas de Python a través de pip, sólo tienes que añadir sus directorios a la variable PATH.
Forma alternativa para los usuarios de OS X
Dentro del código del plugin Python se puede utilizar el pip proporcionado por el sistema para instalar los paquetes necesarios. A continuación, puede hacer que el paquete recién instalado sea accesible añadiéndolo a la ruta.
import sys
import pip
pip.main(['install','--target=/Devel/test', 'elevation'])
sys.path.append("/Devel/test")
Solución casera pero que funciona (probada tanto en Linux como en OS X)
Me decidí por la vía alternativa ya que permite mantener la actualización y el mantenimiento de la biblioteca separados del plugin. Cada vez que un nuevo usuario instala el plugin la última versión de la librería de elevación se descarga directamente y se instala mediante pip dentro de un subdirectorio del 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)