38 votos

Desarrollo de un plugin que depende de una biblioteca externa de Python

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:

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)

0voto

Bruno Vermeulen Puntos 133

Como QGIS utiliza el python preinstalado en un sistema Linux puedes hacer sudo pip install <package> pero eso desordena la configuración por defecto.

Mejor es crear un entorno virtual (por ejemplo /home/<user>/QGIS/venv ), active el entorno virtual y luego instale su <package> como siempre. Lo que tienes que hacer a continuación es dentro del script añadir las siguientes líneas antes de importar el <package> :

import_path = os.path.join('/home/<user>/QGIS/venv/lib/python3.7/site-packages')
sys.path.insert(0, import_path)
import <package>

Su instalación <package> se encontrará ahora.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X