Estoy desarrollando un complemento de Python, el objetivo está integrando en QGIS las funcionalidades de una biblioteca PyPI Python llamada 'elevación'.
¿Existe una manera independiente del sistema operativo de instalar bibliotecas externas de Python y ponerlas a disposición de los complementos de Python?
Ya conozco los diferentes procedimientos específicos del sistema para instalar una dependencia externa de Python, lo que me gustaría hacer es distribuir mi complemento en diferentes entornos sin hacer que la gente se vuelva loca.
Lo que ya sé
Al buscar en la web y 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 QGIS, por lo que para instalar bibliotecas externas de Python debe pasar por el Shell OSGeo4W y usar pip desde allí.
enlaces relacionados:
- Módulos independientes QGIS y Python
- Instalación de las herramientas de configuración 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á preempaquetado dentro de OS X y ubicado en:
/usr/bin/python
El problema aquí es que el pip instalado predeterminado tiene algunas limitaciones y requiere demasiados privilegios.
Una solución rápida es usar home-brew para instalar Python para que su pip pueda ejecutarse en un marco de 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, solo necesita agregar sus directorios a la variable PATH.
Forma alternativa para usuarios de OS X
Dentro del código de Python del complemento, puede usar el pip proporcionado por el sistema para instalar los paquetes requeridos. Luego puede hacer que el paquete recién instalado sea accesible agregándolo a la ruta.
import sys
import pip
pip.main(['install','--target=/Devel/test', 'elevation'])
sys.path.append("/Devel/test")
Solución casera pero funcional (probada en Linux y OS X)
Decidí optar por la alternativa, ya que permite mantener la actualización y el mantenimiento de la biblioteca separados del complemento. Cada vez que un nuevo usuario instala el complemento, la última versión de la biblioteca de elevación se descarga e instala directamente mediante pip dentro de un subdirectorio del complemento.
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)