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

27

Estoy desarrollando un complemento de Python, el objetivo es integrar en QGIS las funcionalidades de una biblioteca PyPI de Python llamada 'elevación'.

¿Existe una forma independiente de SO de instalar bibliotecas Python externas 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é

Buscando 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 Python externas, debe pasar por el OSGeo4W Shell y usar pip desde allí.

enlaces relacionados:

Usuarios de OS X

En este caso, QGIS utiliza el Python incorporado, que está preempaquetado dentro de OS X y se encuentra 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 tu pip pueda ejecutarse en un marco 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 necesitas agregar sus directorios a la variable PATH.

Forma alternativa para usuarios de OS X

Dentro del código Python del complemento, puede utilizar el pip provisto por el sistema para instalar los paquetes necesarios. 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 de trabajo (probada en Linux y OS X)

Decidí ir por el camino alternativo, 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 versión más reciente de la biblioteca de elevación se descarga e instala directamente por 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)
    
pregunta Engineer-G 03.06.2016 - 16:16

4 respuestas

2

Sufrí este problema para ejecutar scripts de Python en QGIS que depende de una biblioteca externa de Python. La solución más sencilla es instalar Boundless Desktop que viene con la línea de comandos e instala su propio python. Usando la línea de comandos, puede ejecutar e instalar (usando pip) cualquier paquete externo de python.

    
respondido por el osmjit 06.10.2017 - 18:58
1

Trabajé en esto un poco recientemente en un proyecto. Desafortunadamente, realmente no hay una gran manera de lograr esto. Su solución es muy similar a la que se me ocurrió, pero no hay garantía de que el usuario tenga instalado pip.

Terminé incluyendo una copia de get_pip.py y usando execfile () para ejecutarlo en el caso cuando no está disponible.

Similar a su solución final:

self.plugin_dir = os.path.dirname(__file__)

try:
    import pip
except:
    execfile(os.path.join(self.plugin_dir, get_pip.py))
    import pip
    # just in case the included version is old
    pip.main(['install','--upgrade','pip'])

try:
    import somelibrary
except:
    pip.main(['install', 'somelibrary'])

Una alternativa, por supuesto, sería incluir la propia biblioteca en el directorio de su complemento. Se arriesga a proporcionar una versión antigua, pero en teoría no importa.

    
respondido por el Jesse McMillan 02.02.2017 - 04:51
1

Tal vez puedas probar virtualenv para instalar dependencias externas. De esta manera, no tiene que preocuparse (tanto) por el entorno del sistema.

enlace

    
respondido por el darnold0714 06.02.2017 - 18:50
1

Esto funcionó para mí (en def run (self)):

    def load_libraries(self):
        import_path = os.path.join(self.plugin_dir, 'lib/python2.7/site-packages')
        sys.path.insert(0, import_path)

y configurando un virtualenv.

Sin embargo, con Windows parece ser una historia diferente. Tuve problemas para instalar matplotlib.

    
respondido por el geekdenz 06.06.2017 - 08:17

Lea otras preguntas en las etiquetas